/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序清单l2—4★★★★★★++★++★★★★★★★★★★★★/ p
+函数介绍:接收线程函数
*入口参数:iparam:指传进线程的参数 *出口参数:(无) *返回值:、无意义。 ★f
UINT CUDP CE::RecvThread(LPVOID iparam) (
川
CUDP CE*pSocket=(CUDP—CE+)iparam; fd set fdRead; int ret;
TIMEVAL aTime j aTime.tv sec=1; aTime.tv usec=0; SOCKADDR IN tmpAddr; int tmpRecVLen; 。 int recvLen; int iErrorCode; while(TRUE) {
//收到退出事件,结束线程
if fwaitF。rSingleObj ect(pSocket->m__ExitThreadEvent,O)==WAIT_OBJECT 0) (
break; )
//将set初始化为空集合 FD ZERO(&fdRead);
//藉pSocket一>m—UDPSocket套接字添加到集合中 FD SET(pSocket->m—UDPSocket,&fdRead); //调用select函数,判断套接字Il0状态
ret:select(0,&fdRead,NULL,NULL,&aTime); if(ret==SOCKET—ERROR) {
iErrorCode =WSAGetLastError(); if(pSocket一>m_OnUdpError) {
oSocket一>m OnUdpError(pSocket一>m pOwner,iErrorCode); }
break;
}
//有事件发生 if(ret>0)
//收到数据
if(FD—ISSET(pSocket一>m—UDPSocket,&fdRead)) ,
f f
tmpAddr.sin—family=AF—INET;
tmpAddr·sin_port 2 htons(pSocket一>m—RemoteAddr.sin_port); tmpAddr.sin addr.s addr=INADDR ANY; tmpRecvLen=sizeof(tmpAddr)j //置空接收缓冲区
ZeroMemory(pSocket一>m recvBuf,4096); //接收数据
recvLen 2 recvfrom(pSocket一>m_UDPSocket,pSocket一>m_recvBuf, 4096,0,(SOCKADDR+)&tmpAddr,&tmpRecvLen); i f f recvLen==SOCKET ERROR) f
iErrorCode=WSAGetLastError()j if(pSocket‘。>m_OnUdpError) {
pSocket一>m_OnUdpError(pSocket一>m_pOwner,iErrorCode); } ’
else if(recvLen==0) .
iErrorCode=WSAGetLastError(); if(pSocket一>m OnUdpError) {
pSocket一>m_OnUdpError(pSocket一>m_pOwner,iErrorCode); } ) else {
//调用回调函数将数据发送出去 if(pSocket‘>m_OnUdpRecv) f
pSocket一>m_OnUdpRecv(pSocket一>m_pOwner,pSocket一> m_recvBuf,recvLen,(SOCKADDR*)&tmpAddr)j } } ) } }
TRACE(L”The read thread had exited.\n-·)j
Windows CE嵌入式高级编程及其实例详解(用c++实现) return 0; )
/★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★+★★++★+★★++/
至此,CUDP CE类就设计完成了,下面就来看看CUDP CE类的使用效果。 (3)设计主对话框,实现UDP通讯。 1)设计如图l2.3所示的主对话框。
图12.3使用CUDP_CE类示例界面
窗体上的主要控件及其属性设置如表l2—1所示。
表12—1 CUDP CE类使用例子界面控件及其属性设置表 控制lD IDC——EDIT——REMOTEHOST IDC——EDIT——REMOTEPORT 备注 编辑框,用于输入远程lP地址,对应成员变量: m—RemoteHost,类型CString 编辑框,用于输入远程端121,对应成员变量:m—RemotePort, 类型int IDC—EDl££0CALPORT IDC——BTN——0PEN IDC——BTN——CLOSE IDC—B刀吐SEND IDC——EDT——SEND IDC——EDT——RECV
编辑框,用于输入本地端口,对应成员变量:m_LocalPort, 类型int 按钮,标题设为“打开”,用于打开UDP服务 按钮,标题设为“关闭”,用于关闭UDP服务 按钮,标题设为“发送”,用于发送数据 编辑框,用于输入发送的字符串 编辑框,用于显示接收到的字符串 2)在CUDPDemoDl9类中添加CUDP CE类私有变量。代码片段如下:
private:
//定义UDP通讯类变量 CUDP—CE m—CEUdp j
注意:在UDPDEMODl9.h文件要引用UDP CE.h,因为这里使用到了CUDP CE类。
3)添加“打开”、“关闭”和“发送数据”按钮的单击事件代码。“打开”按钮用于打开指
定的UDP服务端口,基于此端口可以进行UDP数据报的发送和接收;“关闭”按钮用于关闭 打开的UDP端口,释放相关资源;“发送数据”用于向指定的远程地址和端口发送数据。 这3个事件函数的实现如程序清单l2—5所示。

