UDP及TCP通信程序的设计与实现实验报告.doc
《UDP及TCP通信程序的设计与实现实验报告.doc》由会员分享,可在线阅读,更多相关《UDP及TCP通信程序的设计与实现实验报告.doc(18页珍藏版)》请在咨信网上搜索。
______________________________________________________________________________________________________________ 实验报告 课 程 计算机网络(双语)(课程设计) 实验名称 UDP及TCP通信程序的设计与实现 专业班级 姓 名 学 号 2013 年 5 月 30 日 精品资料 目录 实验目的和内容 1 实验目的 1 实验内容 1 实验环境 2 程序的逻辑框图 2 UDP通信程序的逻辑框图: 2 TCP通信程序的逻辑框图: 3 程序源代码(数据结构的描述、核心算法) 4 1.TCP通信程序源代码 4 2.TCP通信程序数据结构的描述 7 3.TCP通信程序的核心算法 7 4.UDP通信程序源代码 8 5.UDP通信程序数据结构的描述 11 6.UDP通信程序的核心算法 12 实验数据、结果分析 13 TCP通信程序实验结果分析 13 UDP通信程序实验结果分析 14 总结 16 实验目的和内容 实验目的 掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。 实验内容 1. 实现控制台模式下,在单机上基于UDP的聊天程序; 2. 实现控制台模式下,在单机上基于TCP的聊天程序; 3. 上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行; 4. 提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。 实验环境 在win7系统下,visual studio 2008环境下的win32平台下 程序的逻辑框图 UDP通信程序的逻辑框图: TCP通信程序的逻辑框图: 程序源代码(数据结构的描述、核心算法) 1.TCP通信程序源代码 Client端: #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <winsock.h> //初始化函数,初始化版本号 int InitSock(BYTE minorVer = 2, BYTE majorVer = 2) { WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(WSAStartup(sockVersion, &wsaData) != 0) exit(0); return 1; } int main() { char rbuf[256]; char szText[256]; InitSock(); //创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚 SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //判断socket是否创建成功 if(sListen == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } //用于存储IP地址和端口号的变量 sockaddr_in sin; sin.sin_family = AF_INET; //IP协议 sin.sin_port = htons(4567); //端口号 sin.sin_addr.S_un.S_addr = INADDR_ANY; //接收任何IP的连接 //绑定函数,将socket 与 IP地址和端口 绑定在一块 if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("Failed bind() \n"); return 0; } //开始监听,第二个参数表示最大连接数 if(listen(sListen, 2) == SOCKET_ERROR) { printf("Failed listen() \n"); return 0; } //定义一个新的变量 sockaddr_in remoteAddr; int nAddrLen = sizeof(remoteAddr); //用于存储连接客户端的socket SOCKET sClient; //accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP和端口号存在remoteAddr中 sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); printf("接收到一个连接%s \r\n", inet_ntoa(remoteAddr.sin_addr)); while(TRUE) { if(sClient == INVALID_SOCKET) { printf("Failed accept()"); continue; } printf("send:"); scanf("%s",szText); //发送函数,往sClient这个socket中发送szText send(sClient, szText, strlen(szText), 0); //recv为阻塞函数,等待sClient中传来数据 int nRecv = recv(sClient, rbuf, 256, 0); if(nRecv>0) { rbuf[nRecv] = '\0'; printf("receive:%s\n", rbuf); } } closesocket(sClient); closesocket(sListen); WSACleanup(); return 0; } Server端: #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <winsock.h> //初始化函数,初始化版本号 int InitSock(BYTE minorVer = 2, BYTE majorVer = 2) { WSADATA wsaData; WORD sockVersion = MAKEWORD(minorVer, majorVer); if(WSAStartup(sockVersion, &wsaData) != 0) exit(0); return 1; } int main() { InitSock(); //创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(s == INVALID_SOCKET) { printf(" Failed socket() \n"); return 0; } //用于存储IP地址和端口号的变量 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");//要连接的IP地址 //连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到 if(connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { printf(" Failed connect() \n"); return 0; } char buff[256]; char szText[256]; while(true){ //接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数 int nRecv = recv(s, buff, 256, 0); if(nRecv > 0) { buff[nRecv] = '\0'; printf("receive:%s\n", buff); } printf("send:"); scanf("%s",szText); //发送函数,往s这个socket中发送szText这个字符串 send(s, szText, strlen(szText), 0); } closesocket(s); WSACleanup(); return 0; } 2.TCP通信程序数据结构的描述 (1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_in remoteAddr; 和servAddr (2)用于存储连接客户端的socket: SOCKET sClient;和用于存储连接服务器的socket:SOCKET s 3.TCP通信程序的核心算法 服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度, 之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect( ) 和服务器建立连接; 连接一旦建立,客户机和服务器之间就可以通过调用:send( )和recv( ) (或read( )和write( ))来发送和接收数据; 最后,待数据传送结束后,双方调用closesocket() 关闭套接口。 4.UDP通信程序源代码 Client端: #include "stdafx.h" #include <winsock.h> #include <stdlib.h> #include <stdio.h> //在同一主机的不同端口上分别运行服务器程序和客户端程序 WORD RPort = 6666; //远程端口RemotePort char RIP[16]="127.0.0.1"; //远程IP地址RemoteIPAddr WORD LPort = 7777; //本地端口LocalPort char LIP[16]="127.0.0.1"; //本地IP地址LocalIPAddr SOCKET S; //套接口SOCKET struct sockaddr_in rAddr; //远程参数,remoteAddr struct sockaddr_in lAddr; //本地参数,localAddr WSADATA WD; //Winsock DLL信息 int r; //result; //----------------------------------------------- void ShowInfo(char *info){ puts(info); exit(1); } //----------------------------------------------- void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP){ A->sin_family = AF_INET; //TCP/IP协议 A->sin_port = htons(Port); //端口 A->sin_addr.s_addr =inet_addr(IP); //IP 地址 } //------------------------------------------------ void main( ){ WORD v; //wVersionRequested; //-- - - - - - - - Startup Win socket - - - - - - - - v=0x0101; //0x0101 for v1.1, 0x0002 forv 2.0 r = WSAStartup(v, (LPWSADATA)&WD); if(r != 0) ShowInfo("Start_Error"); //-- - - - - - - - Create Win socket - - - - - - - - S = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字 if(S == -1) ShowInfo("socket_Create_Error"); int l=sizeof(rAddr); char Msg[80]; puts("Type exit then Quit Program!"); SetsockAddr(&lAddr, LPort, LIP);//初始化变量lAddr r = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr)); if(r == -1) ShowInfo("bind_Error"); SetsockAddr(&rAddr, RPort, RIP); do{ //-- - - - - - - - Send Mess - - - - - - - - puts("Send:"); gets(Msg); if(!strcmp(Msg,"exit"))// break; r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&rAddr, l);//通过套接字向接收端发送信息 if(r == -1) ShowInfo("Send_Error"); //-- - - - - - - - Recieve Mess - - - - - - - - puts("Send ok! Waiting Recieve..."); // r = recv(S, Msg, 80,0); r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&rAddr, &l);// //发送套接口的主机地址信息存放在rAddr中 if(r == -1) ShowInfo("Recieve_Error"); Msg[r]=0; puts(Msg); puts("Recieve ok!"); }while(1); closesocket(S); WSACleanup(); return ; Server端: #include "stdafx.h" #include <winsock.h> #include <stdlib.h> #include <stdio.h> //在同一主机的不同端口上分别运行服务器程序和客户端程序 WORD RPort = 7777; //远程端口RemotePort char RIP[16]="127.0.0.1"; //远程IP地址RemoteIPAddr WORD LPort = 6666; //本地端口LocalPort char LIP[16]="127.0.0.1"; //本地IP地址LocalIPAddr SOCKET S; //套接口SOCKET struct sockaddr_in rAddr; //远程参数,remoteAddr struct sockaddr_in lAddr; //本地参数,localAddr WSADATA WD; //Winsock DLL信息 int r; //result; //----------------------------------------------- void ShowInfo(char *info){ puts(info); exit(1); } //----------------------------------------------- void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP){ A->sin_family = AF_INET; //TCP/IP协议 A->sin_port = htons(Port); //端口 A->sin_addr.s_addr =inet_addr(IP); //IP 地址 } //------------------------------------------------ void main( ){ WORD v; //wVersionRequested; //-- - - - - - - - Startup Win socket - - - - - - - - v=0x0101; //0x0101 for v1.1, 0x0002 forv 2.0 r = WSAStartup(v, (LPWSADATA)&WD); if(r != 0) ShowInfo("Start_Error"); //-- - - - - - - - Create Win socket - - - - - - - - S = socket(AF_INET, SOCK_DGRAM, 0);//创建套接字 if(S == -1) ShowInfo("socket_Create_Error"); int l=sizeof(rAddr); char Msg[80]; puts("Type exit then Quit Program!"); SetsockAddr(&lAddr, LPort, LIP);//初始化变量lAddr r = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr)); if(r == -1) ShowInfo("bind_Error"); SetsockAddr(&rAddr, RPort, RIP); do{ //-- - - - - - - - Recieve Mess - - - - - - - - //puts("Send ok! Waiting Recieve..."); //r = recv(S, Msg, 80,0); r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&lAddr, &l);//发送套接口的主机地址信息存放在rAddr中 if(r == -1) ShowInfo("Recieve_Error"); Msg[r]=0; puts(Msg); puts("Recieve ok!"); //-- - - - - - - - Send Mess - - - - - - - - puts("Send:"); gets(Msg); if(!strcmp(Msg,"exit"))// break; r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&lAddr, l);//通过套接字向接收端发送信息 if(r == -1) ShowInfo("Send_Error"); }while(1); closesocket(S); WSACleanup(); return ; } 5.UDP通信程序数据结构的描述 (1)SOCKET S:服务器套接字 (2)struct sockaddr_in rAddr:远程参数,remoteAddr,存储TCP/IP协议,IP地址及端口号 (3)struct sockaddr_in lAddr:本地参数,localAddr,存储TCP/IP协议,IP地址及端口号 6.UDP通信程序的核心算法 服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,服务器调用recvfrom ( )等待接收数据。 客户机通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,客户机调用sendto( )向服务器发送数据; 服务器的recvfrom ( ) 接收到客户机的数据后,调用sendto( )向客户机发送应答数据; 客户机的recvfrom ( ) 便接收到了服务器的应答数据; 最后,待数据传送结束后,双方调用closesocket( )关闭套接口。 关于程序中调用的库函数的几点说明: 1. 对sendto函数的说明 int sendto( SOCKET s, //源套接口 char *buf, //待发送数据的缓冲区 int buflen, //缓冲区中数据的长度 int flags, //调用方式标志位,一般取0 struct sockaddr FAR *to, // 指向目的套接口的主机地址 int tolen //目的套接口主机地址的长度 ); sendto函数主要用于SOCK_DGRAM 类型套接口向to参数指定端的套接口发送数据报。对于SOCK_STREAM 类型套接口,to和tolen 参数被忽略;这种情况下sendto( ) 等价于send( ) 。 2. 对recvfrom函数的说明 int recvfrom( SOCKET s //接收套接口 char *buf //接收数据的缓冲区 int len //缓冲区中数据的长度 int flags //调用方式标志位,一般取0 struct sockaddr FAR *from // 获取发送套接口的主机地址 int fromlen //发送套接口的主机地址的长度 ); recvfrom函数主要用于从一个套接口接收数据 实验数据、结果分析 TCP通信程序实验结果分析: 当Client端启动时,Server端收到来自Client端的信号,表明双方的连接已经建立,可以互相通讯,从client端发送“hello”, Server端收到来自Client端的“hello”, Server端也可以向client端发送信息。 UDP通信程序实验结果分析: 打开UDP的client端,并打开UDP的server端,发送“hello”给server端,如下图所示:server端收到信息以后,发送“hi”给client端,client端也能收到信息。 总结 Welcome To Download !!! 欢迎您的下载,资料仅供参考!- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UDP TCP 通信 程序 设计 实现 实验 报告
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文