基于UDP协议的网上聊天程序

基于UDP协议的网上聊天程序

ID:39474374

大小:46.05 KB

页数:10页

时间:2019-07-04

基于UDP协议的网上聊天程序_第1页
基于UDP协议的网上聊天程序_第2页
基于UDP协议的网上聊天程序_第3页
基于UDP协议的网上聊天程序_第4页
基于UDP协议的网上聊天程序_第5页
资源描述:

《基于UDP协议的网上聊天程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、一.多线程编程聊天程序的具体实现1创建MFC-EXE工程,工程名为Chat,Dialogbased。2删除对话框控件,添加自己的控件,各个控件的ID分别为:接受文本框的ID为IDC_EDIT_RECV,发送数据的文本框ID为IDC_EDIT_SEND,发送按钮的ID为IDC_BTN_SEND。其余默认即可。3加载套接字库,进行版本协商MFC环境下使用AfxSocketInit(查看MSDN帮助)AfxSocketInit加载的1.1版本,可以确保Socket库的释放MSDN中提到在CWinApp:

2、:InitInstance中使用在这里就是CChatAPP类的InitInstance中调用if(!AfxSocketInit()){AfxMessageBox("加载套接字库失败!");returnFALSE;}4刚才使用了AfxSocketInit需要加入头文件#include放入到StdAfx.h的头文件中,StdAfx.h是预编译头文件,包括MFC工程必要的头文件5在CChatDlg类中定义一个成员函数,作为套接字初始化工作BOOLInitSocket()同时增加一个

3、变量SOCKETm_socket6实现InitSocket()m_socket=socket(AF_INET,SOCK_DGRAM,0);if(INVALID_SOCKET==m_socket){MessageBox("套接字创建失败!");returnFALSE;}SOCKADDR_INaddrSock;addrSock.sin_family=AF_INET;addrSock.sin_port=htons(1234);10addrSock.sin_addr.S_un.S_addr=inet_ad

4、dr("127.0.0.1");intretval;retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));intretv=WSAGetLastError();if(SOCKET_ERROR==retval){closesocket(m_socket);MessageBox("绑定失败!");returnFALSE;}returnTRUE;7在CChatDlg的OnInitDialog()的最后调用InitSocket()8下面编写接

5、收端程序(1)当接受数据时如果没有数据到来,recvfrom函数会阻塞,从而导致进程暂停运行,所以采用线程来完成(2)创建线程后,我们需要传递两个参数,一个是套接字,一个是对话框的句柄(接受编辑框的句柄),这样可以通过套接字接受数据,传给接受编辑框,但CreateThread只能传递一个参数(第四个),但是个指针9在CChatDlg的头文件中定义一个结构体structRECVPARAM{SOCKETsock;HWNDhwnd;};//注意这里的分号10在CChatDlg的OnInitDialog(

6、)最后,即InitSocket()后RECVPARAM*pRecvParam=newRECVPARAM;pRecvParam->sock=m_socket;pRecvParam->hwnd=m_hWnd;HANDLEhThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);CloseHandle(hThread);returnTRUE;1011加入线程函数,从MSDN中COPY加入一个全局函数,有的单位要求不允许使用全局函数,那

7、这里加给CChatDlg类,作为一个成员函数DWORDWINAPIRecvProc(LPVOIDlpParameter)12此时程序报错,因为要执行RecvProc需要CChatDlg的实例,不能在类中调用,所以报错解决方法:在CChatDlg头文件中,将RecvProc函数定义为static类型13实现线程函数SOCKETsock=((RECVPARAM*)lpParameter)->sock;HWNDhwnd=((RECVPARAM*)lpParameter)->hwnd;deletelpPa

8、rameter;SOCKADDR_INaddrFrom;intlen=sizeof(SOCKADDR);charrecvBuf[200];chartempBuf[300];intretval;while(TRUE){retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);if(SOCKET_ERROR==retval)break;sprintf(tempBuf,"%s说:%s",inet_ntoa(addrFrom

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。