学习MFC下的TCP编程.docx_第1页
学习MFC下的TCP编程.docx_第2页
学习MFC下的TCP编程.docx_第3页
学习MFC下的TCP编程.docx_第4页
学习MFC下的TCP编程.docx_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录1、得到本机IP和主机名2得到本地主机名3主机名和IP地址32、设置某个按钮不可用:43、控制台下socket通信4、服务器端4、客户端端64、MFC下TCP编程(只能服务器发,客户端收)7、服务器端9、客户端105、MFC下TCP编程(可以互发)12服务器端121、在*Dlg*.h中添加:132、在protected:下添加133、在Dlg.cpp中添加内容134、添加自定义消息响应函数135、添加变量146、启动服务器按钮对应的响应函数内容为:157、关闭服务器按钮对应的消息响应函数内容为:168、发送按钮对应的消息响应函数内容为:16、客户端171、在*Dlg*.h中添加:182、在protected:下添加183、在Dlg.cpp中添加内容184、添加自定义消息响应函数19文档:wln Email- very glad you read my document,hope it can help you ,my friend!1、得到本机IP和主机名首先添加ws2_32.lib库文件;再添加头文件 #include程序:UpdateData(true);char hostname128 = ; WSADATA wsaData;CString ip; WSAStartup(MAKEWORD(2, 2), &wsaData); gethostname(hostname, sizeof(hostname); /printf(%s, hostname);SetDlgItemText(IDC_STATIC1,hostname);/name里是本机名 hostent* host = gethostbyname(hostname);sockaddr_in addre;for (int i = 0;host-h_addr_listi;i+)CString ip;memcpy(&addre.sin_addr.s_addr,host-h_addr_list0,host-h_length);ip = inet_ntoa(addre.sin_addr);SetDlgItemText(IDC_STATIC2,ip); WSACleanup();UpdateData(false);得到本地主机名#include#include#pragma comment(lib, Ws2_32.lib)int main() char hostname 128 = ; WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); gethostname(hostname, sizeof(hostname); printf(%s, hostname); WSACleanup(); return 0; 主机名和IP地址/连接 ws2_32.libWORD wVersionRequested; WSADATA wsaData; char name255; CString ip;int err; PHOSTENT hostinfo; wVersionRequested = MAKEWORD( 2, 2 );/版本号2.2 /1.加载套接字库 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; /判断是否我们请求的winsocket版本,如果不是 /则调用WSACleanup终止winsocket的使用并返回 if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; /.ifif ( err = 0 ) if( gethostname ( name, sizeof(name) = 0) if(hostinfo = gethostbyname(name) != NULL) ip = inet_ntoa (*(struct in_addr *)*hostinfo-h_addr_list); WSACleanup( ); SetDlgItemText(IDC_STATIC1,name);/name里是本机名 SetDlgItemText(IDC_STATIC2,ip); /ip中是本机IP UpdateData(false);2、设置某个按钮不可用:m_StartBtn.EnableWindow(TRUE); /可用m_StopBtn.EnableWindow(FALSE); /不可用3、控制台下socket通信首先添加ws2_32.lib库文件;再添加头文件 #include、服务器端/ TCPConsolSer2.cpp : Defines the entry point for the console application./#include stdafx.h#include #include int main(int argc, char* argv)WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字SOCKET sersock,clisock;struct sockaddr_in seraddr,cliaddr;int serport=5556;char buf256;WSADATA wsaData;int len,err;/初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0) printf(加载套接字库失败!n);return -1; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return -1; /判断高低字节是不是1,如果不是1.1的版本则退出 /创建套接字printf(创建套接字.n);sersock = socket(AF_INET, SOCK_STREAM, 0); /Socket地址结构体的创建memset(&seraddr,0,sizeof(seraddr);seraddr.sin_family=AF_INET;seraddr.sin_port=htons(serport);/seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /等价于seraddr.S_un.sin_addr=inet_addr();seraddr.sin_addr.S_un.S_addr=inet_addr();/绑定套接字到服务器地址结构printf(Binding.n);err=bind(sersock, (SOCKADDR*)&seraddr, sizeof(SOCKADDR);if(err!=0)printf(listen failed:%dn,WSAGetLastError();exit(-3);/监听套接字printf(listening.n);err=listen(sersock,5);if(err!=0)printf(listen failed:%dn,WSAGetLastError();exit(-2);/等待连接请求printf(waitting request.n);len = sizeof(cliaddr);/初始化参数,这个参数必须进行初始化clisock=accept(sersock,(SOCKADDR*)&cliaddr, &len);printf(Accept client: %s: port: %dn,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port);sprintf(buf,welcome %s,inet_ntoa(cliaddr.sin_addr);send(clisock,buf,strlen(buf),0);/关闭连接closesocket(clisock);closesocket(sersock);WSACleanup();return 0;、客户端端/ TCPConsoleClient2.cpp : Defines the entry point for the console application./#include stdafx.h#include #include int main(int argc, char* argv)WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字SOCKET sock;struct sockaddr_in sockaddr;int serport=5556 ;char buf256;WSADATA wsaData;int len,err;/初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0) printf(加载套接字库失败!n);return -1; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return -1; /判断高低字节是不是1,如果不是1.1的版本则退出 /创建套接字printf(创建套接字.n);sock = socket(AF_INET, SOCK_STREAM, 0); /Socket地址结构体的创建memset(&sockaddr,0,sizeof(sockaddr);sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(serport);/seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /等价于seraddr.S_un.sin_addr=inet_addr();sockaddr.sin_addr.S_un.S_addr=inet_addr();/连接服务器err=connect(sock,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR);/接收欢迎词memset(buf,0,sizeof(buf);len=recv(sock,buf,sizeof(buf),0);printf(%sn,buf);/关闭连接closesocket(sock);WSACleanup();return 0;4、MFC下TCP编程(只能服务器发,客户端收)首先添加ws2_32.lib库文件;再添加头文件 #include点击服务器“发送”按钮,将数据发送过去;点击客户端”接收”按钮,接收服务器发送来的数据,并显示。、服务器端界面:接收、发送数据均为EDIT,ID分别为IDC_EDIT_RECV,IDC_EDIT_SEND发送按钮的消息响应函数为:UpdateData(true);WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字WSADATA wsaData;/初始化Winsockint err;err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) return; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return; /判断高低字节是不是1,如果不是1.1的版本则退出 /创建套接字SOCKET sersock;sersock = socket(AF_INET, SOCK_STREAM, 0); /Socket地址结构体的创建struct sockaddr_in seraddr;int serport=5556;memset(&seraddr,0,sizeof(seraddr);seraddr.sin_family=AF_INET;seraddr.sin_port=htons(serport);/seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /等价于seraddr.S_un.sin_addr=inet_addr();seraddr.sin_addr.S_un.S_addr=inet_addr();/绑定套接字到服务器地址结构err=bind(sersock, (SOCKADDR*)&seraddr, sizeof(SOCKADDR);if(err!=0)exit(-3);/监听套接字err=listen(sersock,5);if(err!=0)exit(-2);/套接字clisock上接收到数据时,向窗口发送自定义消息RECEIVE_EVENT/WSAAsyncSelect(clisock,GetSafeHwnd(),RECEIVE_EVENT,FD_READ);int len;struct sockaddr_in cliaddr;len = sizeof(cliaddr);/初始化参数,这个参数必须进行初始化SOCKET clisock;clisock=accept(sersock,(SOCKADDR*)&cliaddr, &len); /接受客户端的请求,创建一个新的socket。char buf256;memset(buf,0,sizeof(buf);/printf(Accept client: %s: port: %dn,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port);CString name=小明;sprintf(buf,%s %srn,inet_ntoa(cliaddr.sin_addr),name);CString str;GetDlgItem(IDC_EDIT_SEND)-GetWindowText(str);send(clisock,buf,strlen(buf),0);send(clisock,str,strlen(str),0);/关闭连接closesocket(clisock);closesocket(sersock);WSACleanup();UpdateData(false);、客户端界面:接收、发送数据均为EDIT,ID分别为IDC_EDIT_RECV,IDC_EDIT_SEND定义变量public:CString strtext;接收按钮的消息响应函数为:UpdateData(true);WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字WSADATA wsaData;int err;/初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0) return; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return; /判断高低字节是不是1,如果不是1.1的版本则退出 /创建套接字SOCKET sock;int serport=5556 ;struct sockaddr_in sockaddr;sock = socket(AF_INET, SOCK_STREAM, 0); /Socket地址结构体的创建memset(&sockaddr,0,sizeof(sockaddr);sockaddr.sin_family=AF_INET;sockaddr.sin_port=htons(serport);/seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /等价于seraddr.S_un.sin_addr=inet_addr();sockaddr.sin_addr.S_un.S_addr=inet_addr();/连接服务器err=connect(sock,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR);/接收欢迎词char buf256;memset(buf,0,sizeof(buf);int len;len=recv(sock,buf,sizeof(buf),0);/将接收到的数据在接收框中显示strtext=strtext+n;strtext=strtext+buf;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(strtext);memset(buf,0,sizeof(buf);len=recv(sock,buf,sizeof(buf),0);strtext=strtext+buf;strtext=strtext+rn;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(strtext);/关闭连接closesocket(sock);WSACleanup();UpdateData(false);5、MFC下TCP编程(可以互发)首先添加ws2_32.lib库文件;再添加头文件 #include图示说明一下:接收区位Edit 性质设为多行、readonly等,ID为IDC_EDIT_RECV,发送区IDC_EDIT_SEND,发送按钮为IDC_BTN_SEND服务器端这里客户端与服务器之间可以互相发送多条消息,用到了一个一个函数WSAAsyncSelete()消息响应函数,因此需要自己添加一个消息响应函数:1、在*Dlg*.h中添加:#define ACCEPT_EVENT WM_USER+1042、在protected:下添加afx_msg void OnEvent(WPARAM wParam,LPARAM lParam);3、在Dlg.cpp中添加内容(内容为下面的红色黑体部分,位置注意要对,否则会不起作用。):BEGIN_MESSAGE_MAP(CTCPSer2Dlg, CDialog)/AFX_MSG_MAP(CTCPSer2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_STARTSERVER, OnBtnStartServer)ON_BN_CLICKED(IDC_BTN_CLOSESERVER, OnBtnCloseServer)/AFX_MSG_MAPON_MESSAGE(ACCEPT_EVENT,OnEvent) /消息映射END_MESSAGE_MAP()4、添加自定义消息响应函数void CTCPSer2Dlg:OnEvent(WPARAM wParam,LPARAM lParam)switch(lParam)case FD_ACCEPT:/MessageBox(FD_ACCEPT);closeclisock=1;int len;struct sockaddr_in cliaddr;len = sizeof(cliaddr);/初始化参数,这个参数必须进行初始化clisock=accept(sersock,(SOCKADDR*)&cliaddr, &len); /接受客户端的请求,创建一个新的socket。break;case FD_READ:/欲接收准备好的通知 /MessageBox(FD_READ);/接收欢迎词char buf256;memset(buf,0,sizeof(buf);int len;len=recv(clisock,buf,sizeof(buf),0);/将接收到的数据在接收框中显示strtext=strtext+n;strtext=strtext+buf;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(buf);memset(buf,0,sizeof(buf);len=recv(clisock,buf,sizeof(buf),0);strtext=strtext+buf;strtext=strtext+rn;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(strtext);break;case FD_CLOSE:/MessageBox(FD_CLOSE);/套接字clisock上接收到数据时,向窗口发送自定义消息RECEIVE_EVENTcloseclisock=closesocket(clisock);WSAAsyncSelect(clisock,GetSafeHwnd(),0,0);break;default:MessageBox(default);break;UpdateData(false);5、添加变量SOCKET sersock; /服务器端socketSOCKET clisock; /与客户端通信的socketint closeclisock; /用来判断是不是clisock已经关闭,没有的话就关闭,防止重复关闭,/但多关闭一次没什么影响。CString strtext;/里面的内容就是通信建立时客户端和服务器端互通消息的所有内容。6、启动服务器按钮对应的响应函数内容为:void CTCPSer2Dlg:OnBtnStartServer() / TODO: Add your control notification handler code hereUpdateData(true);WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字WSADATA wsaData;/初始化Winsockint err;err = WSAStartup(wVersionRequested, &wsaData);if (err != 0) return; if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) return; /判断高低字节是不是1,如果不是1.1的版本则退出 /创建套接字sersock = socket(AF_INET, SOCK_STREAM, 0); /Socket地址结构体的创建struct sockaddr_in seraddr;int serport=5556;memset(&seraddr,0,sizeof(seraddr);seraddr.sin_family=AF_INET;seraddr.sin_port=htons(serport);/seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /等价于seraddr.S_un.sin_addr=inet_addr();seraddr.sin_addr.S_un.S_addr=inet_addr();/绑定套接字到服务器地址结构err=bind(sersock, (SOCKADDR*)&seraddr, sizeof(SOCKADDR);if(err!=0)MessageBox(Bind Error!);exit(-3);/监听套接字err=listen(sersock,5);if(err!=0)MessageBox(Listen Error!);exit(-2);GetDlgItem(IDC_BTN_STARTSERVER)-EnableWindow(false);/套接字clisock上接收到数据时,向窗口发送自定义消息RECEIVE_EVENTWSAAsyncSelect(sersock,GetSafeHwnd(),ACCEPT_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);7、关闭服务器按钮对应的消息响应函数内容为:void CTCPSer2Dlg:OnBtnCloseServer() / TODO: Add your control notification handler code here/判断clisock有没有创建,是客户端先断开还是服务器先停止服务,如果clisock没有建立,/ closeclisock=0或如果客户端先停止closeclisock为0,closesocket(clisock)不再执行,如果服务器先停止closeclisock=1(在Accept处赋值)if(closeclisock)closesocket(clisock);closesocket(sersock);/套接字clisock上接收到数据时,向窗口发送自定义消息RECEIVE_EVENTWSAAsyncSelect(sersock,GetSafeHwnd(),0,0);WSACleanup();GetDlgItem(IDC_BTN_STARTSERVER)-EnableWindow(true);8、发送按钮对应的消息响应函数内容为:/发送按钮对应的函数void CTCPSer2Dlg:OnOK() / TODO: Add extra validation hereUpdateData(true);char buf256;memset(buf,0,sizeof(buf);/printf(Accept client: %s: port: %dn,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port);int len=0;CString name=服务器:;sprintf(buf,%srn,name);len=send(clisock,buf,strlen(buf),0);if(len=0)strtext=strtext+n;strtext=strtext+buf;CString str;GetDlgItem(IDC_EDIT_SEND)-GetWindowText(str);len=send(clisock,str,strlen(str),0);/*char bf10;memset(bf,0,sizeof(bf);itoa(len,bf,10);MessageBox(bf);*/strtext=strtext+str;strtext=strtext+rn;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(strtext);UpdateData(false);、客户端界面:这里客户端与服务器之间可以互相发送多条消息,用到了一个一个函数WSAAsyncSelete()消息响应函数,因此需要自己添加一个消息响应函数:1、在*Dlg*.h中添加:#define ACCEPT_EVENT WM_USER+1042、在protected:下添加afx_msg void OnEvent(WPARAM wParam,LPARAM lParam);3、在Dlg.cpp中添加内容(内容为下面的红色黑体部分,位置注意要对,否则会不起作用。):BEGIN_MESSAGE_MAP(CTCPClient2Dlg, CDialog)/AFX_MSG_MAP(CTCPClient2Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_CONNECT, OnBtnConnect)ON_BN_CLICKED(IDC_BTN_DISCONNECT, OnBtnDisconnect)/AFX_MSG_MAPON_MESSAGE(ACCEPT_EVENT,OnEvent) /消息映射END_MESSAGE_MAP()4、添加自定义消息响应函数void CTCPClient2Dlg:OnEvent(WPARAM wParam,LPARAM lParam)switch(lParam)case FD_READ:/欲接收准备好的通知 /MessageBox(FD_READ client);/接收欢迎词char buf256;memset(buf,0,sizeof(buf);int len;len=recv(sock,buf,sizeof(buf),0);/if(!len)/MessageBox(recv wrong!);/将接收到的数据在接收框中显示strtext=strtext+n;strtext=strtext+buf;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(buf);memset(buf,0,sizeof(buf);len=recv(sock,buf,sizeof(buf),0);strtext=strtext+buf;strtext=strtext+rn;GetDlgItem(IDC_EDIT_RECV)-SetWindowText(strtext);break;case FD_CLOSE:/MessageBox(FD_CLOSE client);closesocket(sock);/套接字clisock上接收到数据时,向窗口发送自定义消息RECEIVE_EVENTWSAAsyncSelect(sock,GetSafeHwnd(),0,0);break;default:MessageBox(default client);break;UpdateData(false);5、添加变量public:/创建套接字SOCKET sock;CString strtext;6、连接按钮对应的消息响应函数内容为:void CTCPClient2Dlg:OnBtnConnect() / TODO: Add your control notification handler code hereUpdateData(true);WORD wVersionRequested;/版本号 wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字struct sockaddr_in sockaddr;int serport=5556 ;WSADATA wsaData;int err;/初始化Winsockerr = WSAStartup(wVersionRequested, &wsaData);if (err != 0) return; if (LOBYTE(wsaData.wVersion)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论