资源描述:
《基于udp的网络聊天程序》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、创建一个MFC的对话框工程Chat,界面如图下面是实现步骤:一、调用Afxstock全局函数初始化套接字库,在CChatApp::lnitlnstance(),l,添加代码:if(!AfxSocketlnit()){AfxMessageBox(M加载字库失败!”);returnFALSE;}二、在CChatDIg类中添加一个成员函数:stocketlnit(),并在CChatDlg::OnlnitDialog()中调用一下,代码如下:BOOLCChatDlg::stocketlnit(){m_socket=socket(AF_INET,S
2、OCK_DGRAM,0);if(INVALID_SOCKET==m_socket)MessageBox(n创建套接字失败!”);returnFALSE;}SOCKADDRJNsocketjn;socket_in.sin_family=AF_INET;socketJn.sinjDort=htons(3000);socket_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY);intretval;retval=bind(m_socket,(SOCKADDR*)&socket_in,sizeof(SOCKADDR
3、));if(SOCKET_ERROR==retval){closesocket(m_socket);MessageBox(H绑定套接字失败!”);returnFALSE;}returnTRUE;}三、在CChatDlg::OnlnitDialog()屮创建一个线程,用于接收数据。这是木程序的关键一步,1、接收数据的recvfrom函数会一直等待数据的到來,如果放在主线程中会赌塞系统,所以必须在建一个线程实现。2、线程必须接收对话框传来的套接字,用来接收数据,而得到的数据必须回传给对话框显示出来,但是线程只能接收一个LPVOID型的参数,要
4、同时接受2个参数,就需要提前定义-个struct,里面包含2个成员:sock和hwnd,把这个结构的指针做为参数传递给线程。3、数据的回传通过自定义消息实现,把接收到的数据作为消息的附件参数传给对话框。创建线程的代码:BOOLCChatDlg::OnlnitDialog()RECVPARAM*pRecvparam=newRECVPARAM;//RECVPARAM是含2个参数的结构体pRecvparam->socket=m_socket;pRecvparam->hwnd=m_hWnd;HANDLEhThead=CreateThread(NU
5、LL,0,RecvProc,(LPVOID)pRecvparam,0,NULL);CloseHandle(hThead);}线程代码:DWORDWINAPICChatDlg::RecvProc(LPVOIDIpParameter){SOCKETsock;HWNDhwnd;sock=((RECVPARAM*)lpParameter)->socket;//先取出2个参数hwnd=((RECVPARAM*)lpParameter)->hwnd;deleteIpParameter;SOCKADDRJNaddrFrom;intlen=sizeof(
6、SOCKADDR);//AfxMessageBox("线程启动”);charrecvBuf[200];chartempBuf[300];intrevale;while(TRUE){revale=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);〃接收数据if(SOCKET_ERROR==revale)break;sprintf(tempBuf,”%s说:%s”,inet_ntoa(addrFrom.sin_addr),recvBuf);::PostMessage(hwnd,WM_
7、RECVDATA,0.(LPARAM)tempBuf);〃给对话框发消息,传递接收的数据//AfxMessageBox(tempBuf);}returnTRUE;}四、对话框中加一个对消息的响应两数。需要在3个地方加代码:函数原型说明、消息映射、函数代码。voidCChatDlg::OnRecvData(WPARAMwParam丄PARAMIParam){CStringstrRecv=(char*)IParam;CStringstrTemp;GetDlgltemText(IDC_EDIT_RECV,strTemp);strTemp+=”
8、r”;strTemp+=strRecv;SetDlgltemText(IDC_EDIT_RECV,strTemp);}五、接收部分完成,设计发送部分,给“发送”按钮增加一个响应函数void