




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
“基于 WinSock 2 编写简单的客户/服务器程序”一、实验目的1) 掌握基于 WinSock 2 的网络通信编程。2) 通过编写一个简单的 TCP 应用程序和一个简单的UDP 应用程序,加深对客户/服务器网络交互模型的理解。二、实验环境1) 计算机两台(已安装 Windows XP 操作系统和Visual C+ 6.0 集成开发环境)。2) 交换机一台(例如华为 Quidway S3528P-EA 或者联想iSpirit2924G)。3) 平行双绞线网线若干。三、实验内容建立工程,设置 Visual C+ 6.0 的WinSock 2 网络开发环境:1) 进入“File”“New”“Projects”选项卡,选择“Win32 Console Application”,在“Project name”栏中添加工程名,在“Location”栏目设置好工程存放位置后,按“OK”,在弹出窗口中选择“An empty project”,按“Finish”、“OK”后,便建立了一项新的工程。2) 再进入“File”“New”“Files”选项卡,选择“C+ Source File”,在“File”栏中添加文件名,后缀为.cpp,在“Location”栏目设置好.cpp 源文件存放位置后,按“OK”,便将该.cpp 源文件添加到工程中。3) 再进入“Project”“Settings”“Link”选项卡下的“Object/library Modules”中,添加静态链接函数库ws2_32.lib,WinSock 2 网络开发环境设置完毕。1 编写一个简单的TCP 应用程序客户端#include#include void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); char recvBuf100; recv(sockClient,recvBuf,100,0); printf(%sn,recvBuf); send(sockClient,this is lisi,strlen(this is lisi)+1,0); closesocket(sockClient); WSACleanup();#include /socket程序需要的头文件。#include int main()/*以下这段代码是复制的MSDN 中的WSAStartup 下的代码*/WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return 1; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return 2; /*以下这段代码是复制的MSDN 中的WSAStartup 下的代码*/ /*socket 第一参数是一个地址簇, 对于TCP/IP协议的套接字, 它只能是AF_INET也可以写成PF_INET。 第二参数指定socket类型,对于1.1版本的socket, 它只支持两种类型的套接字, SOCK_STREAM指定产生流式套接字, SOCK_DGRAM产生数据报套接字。 第三个参数是月特定的地址家族簇相关的协议, 如果指定为0, 那么它就会根据地址格式和套接字类别, 自动为你选择一个合适的协议, 这是推荐使用的一种选择协议的方法。 如果这个函数调用成功, 它将返回一个新的SOCKET数据类型的套接字描述符, 如果调用失败, 这个函数就会返回一个INVALID_SOCKET, 错误信息可以通过WASGetLastError函数返回。*/SOCKET socketSrv = socket(AF_INET, SOCK_STREAM , 0);/*sockaddr 和SOCKADDR是一样的可以通过go to difinition 查看。在这里是指定该套接字的本地地址信息,作为bind的第二参数, 在bind中是指向sockaddr结构的指针变量, 有于该地址结构是为所以的地址家族准备的, 这个结构可能(通常会)随所使用的网络歇息不同而不同, 所以, 在bind中用第三个参数指定结构的长度,sockaddr结构定义如下:Struct sockaddru_short sa_family;Char sa_data14; sockaddr 的第一个字段sa_family指定该地址家族, 在这里必须设为AF_INET。 Sa_data仅仅是表示要求一块内存分配区, 起到占位的作用, 该区域中指定于协议相关的具体地址信息, 由于实际要求的只是内存区, 所以对于不同的协议家族, 用不同的结构来替换sockaddr。 除了sa_family外, sockaddr是按网络字节顺序表示的, 在TCP/IP中 我们可以用sockaddr_in结构来替换sockaddr, 以方便我们填写地址信息。Sockaddr_in 的定义如下Struct sockaddr_inshort sin_family;unsigned short sin_port;struct in_addr sin_addr;Char sin_zero8;其中, sin_family表示地址簇, 对于IP地址, sin_family成员将一直是AF_INET。 成员sin_port指定的是将要分配给套接字的端口。 成员sin_addr给出的是套接字的主机IP地址。 而成员sin_zero只是一个填充数, 一时sockaddr_in结构和sockaddr结构的长度一样, 如果这个函数调用成功, 它将返回0. 如果条用失败, 这个函数就会返回一个SOCKET_ERROR, 错误信息可以通过WSAGetLastError函数返回, 将IP地址指定为INADDR_ANY, 允许套接字向任何分配给本机的IP地址发送或接受数据, 多数情况下, 每个机器只用一个IP地址, 但有的机器可能会有多个网卡, 每个网卡都可以有自己的IP地址, 用INADDR_ANY可以简化应用程序的编写, 将地址指定为INADDR_ANY, 允许一个独立应用接受发自多个接口的回应。 如果我们只想让套接字使用多个IP中的一个地址, 就必须指定世界地址, 需要到这一点, 可以用inet_addr()函数, 这个函数需要一个字符串作为参数, 该字符串指定了以点分十进制格式表示的IP地址(192.168.0.16)。 而且inet_addr()函数会返回一个适合分配给S_addr的u_long类型的数值。 Inet_ntoa()函数会完成相反的转换, 他接受一个in_addr结构提类型的参数并返回一个以点分十进制格式表示的IP地址字符串。*/SOCKADDR_IN addrSrv;/*The htonl function converts a u_long from host to TCP/IP network byte order (which is big endian).htonl 函数把一个u_long类型的值转换为网络支持的高字节存放的值。*/addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;/*和htonl函数类似, 是把一个short的类型转化成网络支持的高字节存放的值*/addrSrv.sin_port = htons(6000); int bindRet = bind(socketSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR);if(bindRet) return 3; /*if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service) = SOCKET_ERROR) printf(bind() failed.n); closesocket(ListenSocket); return;MSDN中监听的例子。 5代表监听最多为5个, 多余5个给与拒绝。*/listen(socketSrv, 5); SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR_IN); while(1)/*AcceptSocket = accept( ListenSocket, NULL, NULL ); if (AcceptSocket = INVALID_SOCKET) printf(accept failed: %dn, WSAGetLastError(); closesocket(ListenSocket); WSACleanup(); return 1; else printf(Client connected.n); MSDN中的例子。 Accept函数返回一个成功连接的新的socket。*/ SOCKET sockConnect = accept(socketSrv, (SOCKADDR*)&addrClient, &len); char sendBuf100;char recvBuf100;memset(recvBuf, 0, 100);sprintf(sendBuf, Welcome %s to here!, inet_ntoa(addrClient.sin_addr); send(sockConnect, sendBuf, strlen(sendBuf)+1, 0);recv(sockConnect, recvBuf, 100, 0); printf(%sn, recvBuf);closesocket(sockConnect); return 0; 客户端的程序。#include #include int main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return 1; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return 1; SOCKET socketCli = socket(AF_INET, SOCK_STREAM , 0); SOCKADDR_IN addrCli;/如果是本机的客户端和服务端可以用这个地址127.0.0.1。如果是不同的两个主机需要填写/真实地址。addrCli.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);addrCli.sin_family = AF_INET;addrCli.sin_port = htons(6000); /连接到服务段用connect函数。connect(socketCli, (SOCKADDR*)&addrCli, sizeof(SOCKADDR);char recvBuf100;memset(recvBuf, 0, 100); recv(socketCli, recvBuf, 100, 0);printf(%sn, recvBuf); send(socketCli, MY name is guliang!, strlen(MY name is guliang!)+1, 0);closesocket(socketCli); WSACleanup( );return 0;2 编写一个简单的UDP 应用程序服务器端view plaincopy to clipboardprint?#pragma comment (lib,ws2_32.lib) #include #include void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err = WSAStartup( wVersionRequested, &wsaData); if(err != 0) return; if(LOBYTE( wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) WSACleanup(); return; SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); char recvBuf100; recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len); printf(%sn, recvBuf); closesocket(sockSrv); WSACleanup(); #pragma comment (lib,ws2_32.lib) #include #include void main()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup( wVersionRequested, &wsaData);if(err != 0)return;if(LOBYTE( wsaData.wVersion) != 1 |HIBYTE(wsaData.wVersion) != 1)WSACleanup();return;SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000);bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR);SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);char recvBuf100;recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);printf(%sn, recvBuf);closesocket(sockSrv);WSACleanup(); 客户端view plaincopy to clipboardprint?#pragma comment (lib,ws2_32.lib) #include #include void main() WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested, &wsaData); if(err != 0) return; if(LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1) WSACleanup(); return; SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年下半年吉林延边公交集团公开招聘10人易考易错模拟试题(共500题)试卷后附参考答案-1
- 高铁制梁场复垦施工合同(3篇)
- 高速公路改造合同模板(3篇)
- 安全施工考试题及答案
- 高明租房合同台账模板(3篇)
- 事业单位聘用合同解除与竞业限制期限合同
- 2025河南公务员面试题及答案
- 《中小学校学生家长参与学校课程改革协议》
- 股权代持解除与控制权恢复-法律程序与执行合同
- 中央预算单位公务卡支付结算与财务管理合作协议
- 第3章 即时定位与地图构建技术课件讲解
- 锚杆格梁施工合同书
- 汽车用品采购合同
- P.E.T.父母效能训练
- 《研学旅行课程设计》课件-了解研学旅行概念
- 传统中医针灸技术操作规范
- 沅陵旅游宣传方案
- 个人防护用品使用和检查知识
- MBTI量表完整版本
- 《检验手册》全文
- 基本不等式-高考历年真题
评论
0/150
提交评论