《东南大学Windows Socket编程实验报告.pdf》由会员分享,可在线阅读,更多相关《东南大学Windows Socket编程实验报告.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1/8 Windows SocketWindows Socket 编程实验报告编程实验报告 一、实验目的一、实验目的 1.加深对流量控制、差错处理方法的理解;2.熟悉 TCP/IP 编程,将书本知识运用到实验中;3.开拓学生的创新意识,培养学生的独立动手操作的能力。二、二、实验内容实验内容 利用已有的模拟信道程序,编制发送、接收程序的部分模块,使系统具有可靠的收发功能。三、三、设计原理设计原理 1.整体思路整体思路 实验中,我们采用了无连接的 Socket 编程模式,相对于面向连接的 Socket编程模式较为简单。无连接的 Socket 实现收发功能的过程如下:数据 请求 数据 应答 本实验
2、中,我们采用了停等协议以及单工方式。同时为了保证系统收发功能的稳定进行,我们需要考虑各种故障因素。这里,我们考虑了数据丢失、数据出错以及数据发送延时等故障因素,通过奇偶校验方法以及应答帧的正确与否来判断是否出现以上故障,接着重新发送当前数据,很好地解决以上问题,保证了收发功能的稳定性。服务器 客户机 创建套接字 创建套接字 绑定到本地地址和端口 绑定到本地地址和端口 接收 发送 发送 接收 关闭套接字 关闭套接字 2/8 2.各模块设计各模块设计 发送端(Sender)发送与接收 int SendMsg(char*msg,int len)/由于是无连接的 Socket,因此这里调用函数send
3、to 发送数据 int n;n=sendto(sender_sockfd,msg,len,0,(struct sockaddr*)&channelsender_addr,sizeof(sockaddr);return n;int ReceiverMsg(char*msg)/调用函数 recvfrom 接收数据 int n;int len=sizeof(sockaddr);n=recvfrom(sender_sockfd,msg,MAX_FRAME_LEN,0,(struct sockaddr*)&channelsender_addr,&len);return n;编码/产生发送的信息:头、序号
4、、数据、校验位、长度、尾 void Encode(char msg,int no,int len,char*newmsg)newmsg0=HEADER;/已在 stdAfx.h 中定义为 0 x3c newmsg1=no;/序号 newmsg2=msg;/数据 newmsg4=len;/长度 newmsg5=HEADER;/尾 /计算 msg1的个数,累加到 count 中 int a,b,c;int count=0;c=msg;while(c!=0)/相当于十进制数化为二进制数的过程 a=c%2;b=c/2;if(a=1)count+;c=b;/产生偶校验码 if(count%2=1)new
5、msg3=0 x01;/1的个数为奇数,偶校验码为 1 else newmsg3=0 x00;/1的个数为偶数,偶校验码为 0 3/8 检查应答帧 BOOL check_data(char*msg)if(msg0=HEADER&msg1=ACK&msg2=HEADER)return true;/ACK已定义为 0 x06 else return false;接收信道信息以及差错处理 LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)char msgMAX_FRAME_LEN;/*缓冲区*/char str_show100;/接收信息,写
6、入 msg ReceiverMsg(msg);/在屏幕上打印出来 wsprintf(str_show,%02XH-%02XH-%02XH,msg0,msg1,msg2);Show_msg_ListBox(str_show);/差错处理 if(check_data(msg)/应答帧正确,继续发送剩余帧 iSendno+;/已正确发送的帧数加 1,iSendno 在前面已经初始化为 0 if(iSendno=msglen)bSending=0;/发送完毕 else/发送下一帧 bSending=1;Encode(str_sendiSendno,iSendno,msglen,now_send);Se
7、ndMsg(now_send,DATA_FRAME_LEN);else/应答帧错误,重新发送当前帧 Encode(str_sendiSendno,iSendno,msglen,now_send);SendMsg(now_send,DATA_FRAME_LEN);return 1;接收端(Receiver)发送与接收 int ReceiverMsg(char*msg)/调用函数 recvfrom 接收数据 int n;int len=sizeof(sockaddr);n=recvfrom(receiver_sockfd,msg,MAX_FRAME_LEN,0,(struct sockaddr*)
8、&channelsender_addr,&len);4/8 return n;int SendMsg(char*msg,int len)/调用函数 sendto 发送数据 int n;n=sendto(receiver_sockfd,msg,len,0,(struct sockaddr*)&channelsender_addr,sizeof(sockaddr);return n;检查校验位 BOOL check_data(char*msg)int a,b,c,d;int count=0;c=msg2;/将信息帧中的数据提取出 while(c!=0)a=c%2;b=c/2;if(a=1)coun
9、t+;c=b;d=count%2;/检查 msg 中数据的1的个数是奇数还是偶数,并与校验位比较,若数据发送正确,则 count 对 2 取余数的结果应该与校验码相同 if(d=msg3)return true;else return false;接收信道信息以及构造应答帧 LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)char str_sendMAX_FRAME_LEN;char check_ansANS_FRAME_LEN;char show_str100;/接收信息,写入 str_send ReceiverMsg(str_se
10、nd);/在屏幕上输出接收的信息 wsprintf(show_str,Sender:%02XH-%02XH-%02XH-%02XH-%02XH-%02XH%c,str_send0,str_send1,str_send2,str_send3,str_send4,str_send5,str_send2);5/8 Show_msg_ListBox(show_str);/应答处理 if(check_data(str_send)/接收正常 iRevno+;/已接收的正确帧数加 1,iRevno 在前面已经初始化为 0 if(iRevno=str_send4)/接收所有的数据帧,显示提示信息 wsprin
11、tf(show_str,Receiver 已经正确接收所有数据!);Show_msg_ListBox(show_str);if(iRevno=str_send4)/没有接收完全,发送应答帧 ACK,继续接收 check_ans0=HEADER;check_ans1=ACK;/ACK 定义为 0 x06 check_ans2=HEADER;SendMsg(check_ans,ANS_FRAME_LEN);else/接收出错,发送 NAK 应答帧,提示 Sender 重新发送 wsprintf(show_str,接收到错误数据!);/提示接收到错误数据 Show_msg_ListBox(show_
12、str);check_ans0=HEADER;check_ans1=NAK;/NAK 定义为 0 x15 check_ans2=HEADER;SendMsg(check_ans,ANS_FRAME_LEN);return 1;四、四、实验结果极其分析实验结果极其分析 假定要发送的数据为”abcde”,各实验结果截图如下:1正常发送 6/8 这时,当在 Sender 中输入 abcde,并点击发送,接收端能够正常接收到所发信息 abcde。2数据丢失 这种情况下,当发送信息时,由于数据 c 的丢失,接收端起初只收到 a 跟 b,经过一段时间后接收到之后的信息。7/8 3数据延时 这种情况下,当发
13、送数据时,channel 中发送数据 c 时提示发送超时,并且立即重发,所以接收端能够接收到完整的信息,最后接收到延时发送到的 c。4数据出错 这种情况下,当发送数据时,发送到 c 时,错发成了 b,接收端提示接收到错误数据,并且将错误的应答帧 3CH15H3CH 发送到发送端,发送端重新发送数据,最后接收端接收到正确完整的信息。5随机情况 点击 channel 中的随机后,所发生的情况是前面其中情况的综合,这里不再重复。通过以上 5 种不同情况的测试,该系统已经基本能够完成稳定收发数据的功 8/8 能,很好地达到了实验之前所期望的效果。可能中间还有些许 bug 没有被发现,但是总体需要实现的功能已经达到,还是可以接受的。通过此次实验,我加深了对差错处理方法的理解,并且大致熟悉了基于 UDP的 Windows Socket 设计方法,虽然只是补充一个大系统之中某些具体的函数。这次实验,我终于能够将书本知识运用到了实际情况之中,这种能够将理论运用到实际中的感觉很好。另外,在这次实验中,我为了了解 Windows Socket 的部分函数,查阅了很多资料,包括直接通过 MSDN 对相关函数进行了解,这让我感受到我们在课堂上学到的知识还是远远不够的,更多的还是要靠自己平时的多多积累与资料文献的大量查阅。
限制150内