实验四_MFC网络编程-.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:6 大小:112KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

实验四_MFC网络编程-.doc

实验四_MFC网络编程-.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

新建一个基于对话框、支持Windowsockets的MFC可执行应用程序(exe);设计如图所示界面:对话框控件ID设置接收数据框架:IDC_STATIC接收数据编辑框:IDC_EDIT_RECV发送数据编辑框:IDC_STATICIP地址控件:IDC_IPADDRESS1发送数据编辑框:IDC_EDIT_SEND发送命令按钮:IDC_BTN_SEND在MFC中调用AfxSocketInit()加载套接字库,参考MSDN两个版本:在CWinApp::InitInstance中调用;在StdAfx.h中包含Afxsock.h头文件源码:if(!AfxSocketInit()){AfxMessageBox("加载套接字库失败!");returnFALSE;}创建并初始化套接字,为C***Dlg类添加一个private权限SOCKET类型的变量m_socket和一个BOOL类型的InitSocket()成员函数,在OnInitDialog()函数中调用InitSocket()函数实现初始化:函数实现代码如下:BOOLCCHATDlg::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(6000);addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);intretval;retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));if(SOCKET_ERROR==retval){closesocket(m_socket);MessageBox("绑定失败!");returnFALSE;}returnTRUE;}实现接收端功能接收数据的时候会有阻塞,处理方式使用一个单独的线程,采用CreateThread();(1)先在C***Dlg类的前面定义一个结构体:structRECVPARAM{SOCKETsock;HWNDhwnd;};(2)在OnInitDialog()函数中定义一个RECVPARAM类型的指针,然后初始化:RECVPARAM*pRecvParam=newRECVPARAM;pRecvParam->sock=m_socket;pRecvParam->hwnd=m_hWnd;HANDLEhThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);CloseHandle(hThread);(3)在C***Dlg类添加函数成员,写线程函数:staticstaticDWORDWINAPIRecvProc(LPVOIDlpParameter);//定义线程函数DWORDWINAPICCHATDlg::RecvProc(LPVOIDlpParameter){SOCKETsock=((RECVPARAM*)lpParameter)->sock;HWNDhwnd=((RECVPARAM*)lpParameter)->hwnd;deletelpParameter;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.sin_addr),recvBuf);//利用PostMessage将消息传递给对话框。::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);}return0;}(4)在C***Dlg类上线定义消息的值:#defineWM_RECVDATAWM_USER+1消息响应