基于WSAAsyncSelect模型的通信程序设计.doc_第1页
基于WSAAsyncSelect模型的通信程序设计.doc_第2页
基于WSAAsyncSelect模型的通信程序设计.doc_第3页
基于WSAAsyncSelect模型的通信程序设计.doc_第4页
基于WSAAsyncSelect模型的通信程序设计.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

集美大学计算机工程学院实验报告课程名称:TCP/IP协议与通信程序设计班级:实验成绩:实验项目名称:基于WSAAsyncSelect模型的通信程序设计学号:上机实践日期:2016-05-12实验项目编号:08组号:1上机实践时间: 2学时一、 实验目的 了解基于WSAAsyncSelect模型通信程序的编写,编译和执行二、 实验内容与设计思想编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递。客户端向服务器端发送“请输出从1到1000内所有的质数”,服务器回应客户端给出结果。三、 实验使用环境操作系统: Microsoft Windows XP SP2编程环境:Visual C+ 6.0四、实验步骤和调试过程源代码:服务器端:#include #include #pragma comment(lib, WS2_32)/ 链接到WS2_32.lib#include#define WM_SOCKET WM_USER + 101/ 自定义消息class CInitSockpublic:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)/ 初始化WS2_32.dllWSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(:WSAStartup(sockVersion, &wsaData) != 0) return;CInitSock():WSACleanup();CInitSock theSock; /加载套接字库LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);bool isprime(int p)/判断p是否为质数 int sq=(int)sqrt(p); bool flag=true; int i; for(i=2;i=sq;i+) if(p%i=0) flag=false; break; if(!flag&i=sq) return false; else return true;char * getallprime(int n) /将num以内的所有质数放在同一字符串中char szprime4096 = 质数: ;int len=strlen(szprime)+strlen(,);for(int i=2 ; i = n ; i+ )if(isprime(i) char sznum10;itoa(i,sznum,10);char * sztemp=strcat(szprime,sznum);len+=strlen(sznum);szprimelen-1=,;len+=strlen(,);/printf(%sn,szprime); return szprime;int main()char szClassName = MainWClass;WNDCLASSEX wndclass;/ 用描述主窗口的参数填充WNDCLASSEX结构wndclass.cbSize = sizeof(wndclass);wndclass.style = CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc = WindowProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = NULL;wndclass.hIcon = :LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = :LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH):GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szClassName ;wndclass.hIconSm = NULL;:RegisterClassEx(&wndclass); / 创建主窗口HWND hWnd = :CreateWindowEx( 0,szClassName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL);if(hWnd = NULL):MessageBox(NULL, 创建窗口出错!, error, MB_OK);return -1;USHORT nPort = 4567;/ 此服务器监听的端口号/ 创建监听套节字SOCKET sListen = :socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(nPort);sin.sin_addr.S_un.S_addr = INADDR_ANY;/ 绑定套节字到本地机器if(:bind(sListen, (sockaddr*)&sin, sizeof(sin) = SOCKET_ERROR)printf( Failed bind() n);return -1;/ 将套接字设为窗口通知消息类型。:WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE);/ 进入监听模式:listen(sListen, 5);/ 从消息队列中取出消息MSG msg;while(:GetMessage(&msg, NULL, 0, 0)/ 转化键盘消息:TranslateMessage(&msg);/ 将消息发送到相应的窗口函数:DispatchMessage(&msg);/ 当GetMessage返回0时程序结束return msg.wParam;LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg)case WM_SOCKET:/ 取得有事件发生的套节字句柄SOCKET s = wParam;/ 查看是否出错if(WSAGETSELECTERROR(lParam):closesocket(s);return 0;/ 处理发生的事件switch(WSAGETSELECTEVENT(lParam)case FD_ACCEPT:/ 监听中的套接字检测到有连接进入SOCKET client = :accept(s, NULL, NULL);:WSAAsyncSelect(client, hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);break;case FD_WRITE:break;case FD_READ:char szText1024 = 0 ;if(:recv(s, szText, 1024, 0) = -1):closesocket(s);elseprintf(接收数据:%s, szText);char * szReply=getallprime(1000); /得到1000以内的所有质数:send(s, szReply, strlen(szReply), 0); /响应客户端,回以szReplybreak;case FD_CLOSE: :closesocket(s);break;return 0;case WM_DESTROY:PostQuitMessage(0) ;return 0 ;/ 将我们不处理的消息交给系统做默认处理return :DefWindowProc(hWnd, uMsg, wParam, lParam);客户端:#include #include #pragma comment(lib, WS2_32)/ 链接到WS2_32.libclass CInitSockpublic:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)/ 初始化WS2_32.dllWSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(:WSAStartup(sockVersion, &wsaData) != 0) return;CInitSock():WSACleanup();CInitSock theSock; /加载套接字库int main()/ 创建套节字SOCKET s = :socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s = INVALID_SOCKET)printf( Failed socket() n);return 0;/ 也可以在这里调用bind函数绑定一个本地地址,无则系统将会自动安排/ 填写远程地址信息sockaddr_in servAddr; servAddr.sin_family = AF_INET;servAddr.sin_port = htons(4567);/要连接的服务器地址servAddr.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);/没有联网,直接使用127.0.0.1即可if(:connect(s, (sockaddr*)&servAddr, sizeof(servAddr) = -1)printf( Failed connect() n);return 0;/发送数据char buf = 请输出从1到1000内所有的质数;printf(发送数据:%sn,buf);send(s, buf, strlen(buf), 0);Sleep(6);/ 接收数据char buff3000;int nRecv = :recv(s, buff, 3000, 0);if(nRecv 0)buffnRecv = 0;printf(接收到数据:n%sn, buff);/ 关闭套节字:closesocket(s);ret

温馨提示

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

评论

0/150

提交评论