




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机通信网络实验UDP/TCP通信实验 学院: 班级: 学号: 姓名: 2012年11月6日一、 实验目的熟练掌握UDP、TCP Client/Server模式的通信原理二、 实验内容传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议。面向连接是指一次正常的TCP传输需要通过在TCP客户端和TCP服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。TCP通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。要通过TCP传输数据,必须在两端主机之间建立连接。举例说明,TCP客户端需要和TCP服务端建立连接,过程如图所示:第一步中,客户端向服务端提出连接请求。这时TCP SYN标志置位。客户端告诉服务端序列号区域合法,需要检查。客户端在TCP报头的序列号区中插入自己的ISN。服务端收到该TCP分段后,在第二步以自己的ISN回应(SYN标志置位),同时确认收到客户端的第一个TCP分段(ACK标志置位)。在第三步中,客户端确认收到服务端的ISN(ACK标志置位)。到此为止建立完整的TCP连接,开始全双工模式的数据传输过程。根据以上内容编写一个TCP Client/Server模式的通信程序。事实上网络程序是由两个部分组成:客户端、服务器端它们的建立步骤如下:服务器端 socket-bind-listen-accept客户端 socket-connect三、 实验步骤1. 编写UDP、TCP Client/Server模式的通信程序;2. 调试并运行自己编写的实现程序;3. 了解TCP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在实验报告中写出原因分析;4. 保留编写的实现程序。四、 实验过程1. TCP Client/Server模式的通信程序服务器端操作 socket(套接字):1在初始化阶段调用WSAStartup() 2、建立Socket3、绑定端口4、监听5、服务器端接受客户端的连接请求6、发送及接收信息7、结束 socket 连接相应的程序:/* server.c *#include /WINSOCK API的头文件,需要包含在项目中#pragma comment(lib,ws2_32.lib) /WINSOCK API连接库文件#include#includevoid main()WORD wVersionRequested; WSADATA wsaData; int err; int len; char recvBuf50; char sendBuf50; SOCKET sockSrv; /用于服务器监听的Socket SOCKADDR_IN addrSrv; /存放服务端套接字信息 SOCKADDR_IN addrClient; /存放连接上的客户端套接字信息SOCKET new_sock; /用于连接后新的socket/* 初始化阶段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData ); /此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,才可以再调用其他Windows Sockets DLL中的API函数 /wsaData用来存储系统传回的关于WinSocket的资料 if ( err != 0 ) /err=0就表示初始化成功 return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return;/* 建立socket * sockSrv=socket(AF_INET,SOCK_STREAM,0);/调用Socket()函数在服务器建立监听的Socket,并定义此Socket所使用的通信协议。/指定地址描述为AF_INET/指定socket类型为SOCK_STREAM,建立的是遵从TCP/IP协议的socketif(sockSrv=-1)return; /错误检查/* 绑定端口 * addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /设置服务器地址,INADDR_ANY表示使用自己的IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); /设定端口为6000 if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)=-1)return;/ 绑定端口并检查/* 监听 * if(listen(sockSrv,5)=-1)return;/使服务器端的Socket进入监听状态,并设定可以建立的最大连接数为5/* 发送及接受消息 * len=sizeof(SOCKADDR_IN); /Socket的地址值的长度 while(1)new_sock=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/ 接受客户端连接,获取客户端的ip地址 if(new_sock=-1)continue;printf(got connection from client:%sn-Input exit to disconnect from client.-n,inet_ntoa(addrClient.sin_addr);/ 接受客户端连接,获取客户端的ip地址printf(Server:);scanf(%s,sendBuf); /输入服务器要发送的消息,或者输入exit可断开连接while(strcmp(sendBuf,exit)!=0)send(new_sock,sendBuf,strlen(sendBuf)+1,0);/ 发送消息到客户端recv(new_sock,recvBuf,50,0);/ 接受客户端消息if(strcmp(recvBuf,exit)=0)break;printf(Client:%snServer:,recvBuf); scanf(%s,sendBuf); /输入服务器要发送的消息,或者输入exit可断开连接 send(new_sock,exit,5,0);/ 发送消息到客户端printf(-The session is terminated!-n); closesocket(new_sock);/断开连接/* end of program *客户端操作 socket(套接字):1在初始化阶段调用WSAStartup() 2、建立Socket3、设置服务器地址及端口号4、连接服务器5、发送及接收信息6、结束 socket 连接#include #include /WINSOCK API的头文件,需要包含在项目中#pragma comment(lib, ws2_32.lib) /WINSOCK API连接库文件#include void main() WORD wVersionRequested; WSADATA wsaData; /WSAata用来存储系统传回的关于WinSocket的资料。 int err;SOCKET sockClient; SOCKADDR_IN addrSrv;char recvBuf50;char sendBuf50;/* 初始化阶段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData );/此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,才可以再调用其他Windows Sockets DLL中的API函数 /wsaData用来存储系统传回的关于WinSocket的资料 if ( err != 0 )return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /* 建立socket、发送、接受消息 * sockClient=socket(AF_INET,SOCK_STREAM,0);/ AF_INET .tcp连接 /初始化连接与端口号 addrSrv.sin_addr.S_un.S_addr=inet_addr(222.25.162.196); /设置服务器地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); / 设置端口号 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);/连接服务器 printf(-got connection from server.-n-Input exit to disconnect from server.-n); recv(sockClient,recvBuf,50,0);/接受数据 while(strcmp(recvBuf,exit)!=0) printf(Server:%snClient:,recvBuf); scanf(%s,sendBuf); /输入服务器要发送的消息 if(strcmp(sendBuf,exit)=0)send(sockClient,exit,5,0);break; send(sockClient,sendBuf,strlen(sendBuf)+1,0);/发送数据 recv(sockClient,recvBuf,50,0);/接受数据printf(-The session is terminated!-n); closesocket(sockClient);/关闭连接 WSACleanup();试验过程:1、在IP地址为:222.25.162.196的主机上打开服务器;2、在IP地址为:222.25.162.84的主机上打开客户端;3、在IP地址为:222.25.162.5的主机上也打开客户端;4、服务器与IP地址为:222.25.162.84的主机进行通信,然后断开连接;5、服务器与IP地址为:222.25.162.5的主机进行通信,然后断开连接;IP地址为:222.25.162.196的主机上的截图IP地址为:222.25.162.84的主机上的截图IP地址为:222.25.162.5的主机上的截图分析:客户端1:IP地址为:222.25.162.84客户端2:IP地址为:222.25.162.5从截图上可以看出服务器先与客户端1连接上,建立步骤为:服务器端 socket-bind-listen-accept客户端 socket-connect当它们通信结束断开连接后,服务器再与客户端2连接进行通信。这是因为在accept()函数中,当某个客户端试图与服务器监听的端口连接时,该连接请求将排队等待服务器用accept接收它并为其建立一个连接。当客户端2试图与服务器监听的端口连接时,服务器正在与客户端1通信,因此它排队等候。当服务器断开与客户端1的连接后,服务器用accept将排队等待的客户端2接收并为其建立一个连接,与其通信。2. UDP Client/Server模式的通信程序 服务器端操作 socket(套接字):1在初始化阶段调用WSAStartup() 2、建立Socket3、绑定端口4、发送及接收信息5、结束 socket 连接/* server.c *#include /WINSOCK API的头文件,需要包含在项目中#pragma comment(lib,ws2_32.lib) /WINSOCK API连接库文件#include#includeconst int bufferlen=1024; /缓存器大小void main()WORD wVersionRequested; WSADATA wsaData; int err; int len;int fromlen=sizeof(struct sockaddr); char recvBufbufferlen; /接受缓存 char sendBufbufferlen; /发送缓存 SOCKET sockSrv; /用于服务器监听的Socket SOCKADDR_IN addrSrv; /服务端地址 SOCKADDR_IN addrClient; /客户端地址/* 初始化阶段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData ); /wsaData用来存储系统传回的关于WinSocket的资料 if ( err != 0 ) /err=0就表示初始化成功return; if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return;/* 建立socket * sockSrv=socket(AF_INET,SOCK_DGRAM,0);/调用Socket()函数在服务器建立监听的Socket,并定义此Socket所使用的通信协议。/指定socket类型为SOCK_DGRAM,使用不连续不可靠的数据包连接,即UDP协议if(sockSrv=-1)return; /错误检查/* 绑定端口 * addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /设置服务器地址,INADDR_ANY表示使用自己的IP地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); /设定端口为6000 if(bind(sockSrv,(LPSOCKADDR)&addrSrv,sizeof(SOCKADDR)=-1)return;/ 绑定端口并检查/* 发送及接受消息 * len=sizeof(SOCKADDR_IN); /Socket的地址值的长度 memset(recvBuf,0,sizeof(recvBuf); /初始化接收缓冲区printf(-Server waiting.-n); while(1)recvfrom(sockSrv,recvBuf,bufferlen,0,(SOCKADDR*)&addrClient,&fromlen);/从客户端接收数据if(strcmp(recvBuf,exit)=0) /如果接受到exit指令,直接continue,等待接受下一个客户端的连接printf(-The session with %s is terminated!-nn,inet_ntoa(addrClient.sin_addr);continue; printf(client-%s:%sn,inet_ntoa(addrClient.sin_addr),recvBuf);/输出客户IP地址、端口号和接收到的数据printf(server:);scanf(%s,sendBuf); /输入服务器要发送的消息,或者输入exit可断开连接if(strcmp(sendBuf,exit)=0)sendto(sockSrv,exit,5,0,(SOCKADDR *)&addrClient,len);printf(-The session with %s is terminated!-nn,inet_ntoa(addrClient.sin_addr);continue; sendto(sockSrv,sendBuf,sizeof(sendBuf)+1,0,(SOCKADDR *)&addrClient,len); /给客户发送信息printf(n); closesocket(sockSrv); /关闭连接WSACleanup();/* end of program *客户端操作 socket(套接字):1在初始化阶段调用WSAStartup() 2、建立Socket3、设置服务器地址及端口号4、发送及接收信息5、结束 socket 连接 相应的程序:/* client.c *#include #include /WINSOCK API的头文件,需要包含在项目中#pragma comment(lib, ws2_32.lib) /WINSOCK API连接库文件#include const int bufferlen=1024;void main() WORD wVersionRequested; WSADATA wsaData; /WSAata用来存储系统传回的关于WinSocket的资料。 int err;int len;SOCKET sockClient; /用于服务器监听的SocketSOCKADDR_IN addrSrv; /服务器地址char recvBufbufferlen; /接受缓存char sendBufbufferlen; /发送缓存char serverip20; /* 初始化阶段 * wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1版本 err = WSAStartup( wVersionRequested, &wsaData ); /wsaData用来存储系统传回的关于WinSocket的资料 if ( err != 0 )return; if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( ); return; /* 建立socket、发送、接受消息 * sockClient=socket(AF_INET,SOCK_DGRAM,0);/ AF_INET .udp连接printf(input server IP:); scanf(%s,serverip); /输入服务器ip addrSrv.sin_addr.S_un.S_addr=inet_addr(serverip); /设置服务器地址 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); / 设置端口号memset(recvBuf,0,sizeof(recvBuf); /初始化接收缓冲区len=sizeof(SOCKADDR_IN); /Socket的地址值的长度 printf(-n); while(1)printf(client:);scanf(%s,sendBuf); /输入服务器要发送的消息,或者输入exit可断开连接if(strcmp(sendBuf,exit)=0) /当客户端要断开连接时,给服务器发送exit,跳出循环sendto(sockClient,exit,5,0,(SOCKADDR *)&addrSrv,len);printf(-The session is terminated!-n);break;sendto(sockClient,sendBuf,sizeof(sendBuf)+1,0,(SOCKADDR *)&addrSrv,len); /发送消息recvfrom(sockClient,recvBuf,bufferlen,0,(SOCKADDR *)&addrSrv,&len); /接受来自服务器的消息if(strcmp(recvBuf,exit)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- CN120205008A 一种用于光伏一体化玻璃釉料的均匀混合搅拌装置
- 铁及其重要化合物(复习讲义)-2026年高考化学一轮复习(山东专用)原卷版
- 天津和平区某中学2024-2025学年八年级上学期期末考试物理试题
- 诗词赏析15首(原卷版)-2023-2024学年八年级语文下学期期
- 人生之舟(第四单元)-2025-2026学年七年级语文上册阅读素养通关训练(解析版)
- 老师不做课件的原因
- 配眼镜基础知识培训课件
- 《外墙外保温系统用建筑密封胶》编制说明
- 2025年度绿色建材砂石料采购合作协议书
- 2025年度知识产权许可使用合同承诺书
- 项目部刻章申请书
- 版挖掘机租赁合同
- 语言学概论全套教学课件
- JJF 1265-2022生物计量术语及定义
- GB/T 8118-2010电弧焊机通用技术条件
- GB/T 17421.7-2016机床检验通则第7部分:回转轴线的几何精度
- 电工技能测试
- 药事管理学全套课件
- 数字色彩课件
- 社区心理学课件
- 质量整改通知单(样板)
评论
0/150
提交评论