实验四-单播通信实yan_第1页
实验四-单播通信实yan_第2页
实验四-单播通信实yan_第3页
实验四-单播通信实yan_第4页
实验四-单播通信实yan_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

网络程序设计实验报告实验名称:单播通信实验实验类型:验证型指导教师:贾浩专业班级:信安1204姓名:马灿学号:20233252电子邮件:实验地点:东6E307实验日期:实验成绩:__________________________一、实验目的掌握TCP效劳器程序和客户程序的编程流程;熟悉面向连接的C/S程序使用的winsockAPI。二、实验设计流套接字编程模型流式套接字的效劳器进程和客户端进程在通信前必须创立各自的套接字并建立连接,然后才能对相应的套接字进行“读〞、“写〞等操作,实现数据的传输。涉及的函数包括:创立套接字函数socketSOCKETsocket〔intaf,inttype,intprotocol〕;//由于采用流套接字进行数据传输,因此type参数必须设置为SOCK_STREAM,protocol参数必须设置为IPPROTO_TCP。绑定本地地址到所创立的套接字函数bindintbind〔SOCKETs,conststructsockaddr*name,intnamelen〕;监听网络连接请求函数listenintlisten〔SOCKETs,intbacklog〕;连接请求函数connectintconnect〔SOCKETs,conststructsockaddrFAR*name,intnamelen〕;接受请求函数acceptSOCKETaccept〔SOCKETs,structsockaddr*addr,int*addrlen〕;发送数据函数sendintsend〔SOCKETs,constchar*buf,intlen,intflags〕;接收数据函数recvintrecv〔SOCKETs,char*buf,intlen,intflags〕;关闭套接字函数closesocketintclosesocket〔SOCKETs〕;实验设计1.设计效劳端程序,效劳端程序首先需要创立套接字并监听,等待用户连接上后,从客户端接受文件地址〔包括文件路径和文件名〕的字符串,然后翻开参数所指文件,并读取文件传给客户端,为了兼顾大文件的传输,应该设计为每次传输制定长度的信息,分次传输,这样不管大文件还是小文件都可以正确的传输,传输文件结束后关闭套接字,并退出程序。2.设计客户端程序,客户端首先需要创立套接字并连接到效劳器端,然后接受用户输入的文件地址并传输给效劳器端,等待效劳器端将文件信息传回,因为是分次传输,所以应该判断是否传输结束,如果已经传输结束,那么关闭套接字并退出程序。3.流套接字编程时序图TCP效劳器程序和客户程序的创立过程三、实验过程〔包含实验结果〕1.针对实验要求设计代码2.编写代码实现要求3.实验结果四、讨论与分析accept()函数,connect〔〕函数会阻塞吗?如果阻塞,说明在什么情况下阻塞。请给出在VC环境下的验证方法。accept()函数在请求连接的队列为空时就会阻塞,一直等到有新的用户连接请求并响应,而当请求连接的对流不为空时是不会阻塞的,将获取请求队列中的请求并做相应处理。测试方法为,在accept函数调用前打印字符串“beforeacceptfunction〞,并记录当前系统时间,在accept函数调用之后打印字符串“afteracceptfunction〞和当前系统时间与前一时间的时间差,然后开启效劳器,不启动任何客户端程序,观察控制台的输出情况,假设只打印了“beforeacceptfunction〞那么说明程序阻塞。然后重新开启效劳器,并同时开启多个〔限定数量内〕客户端程序向效劳器发起连接请求,观察控制台的输出,假设同时打印并“beforeacceptfunction〞和“afteracceptfunction〞字符串,并且打印的时间间隔很小,那么说明没有阻塞connect()函数不会发生阻塞,当客户端发起连接请求,而没有得到效劳器回应,如效劳器未开启或超出最大连接数,那么客户端的请求会自动返回连接失败。测试方法为在connect函数调用前打印字符串“beforeconnectfunction〞,在其调用后打印“afterconnectfunction〞,同样记录并打印时间差,在不开启效劳器程序时,直接翻开客户端程序发起连接请求,观察控制台的输出,假设打印了“beforeconnectfunction〞和“afterconnectfunction〞,且打印的时间差很短,那么说明connect函数不阻塞。connect()函数调用触发什么过程?connect()函数的调用将触发三次握手过程。即第一次握手:建立连接时,客户端发送syn包(syn=j)到效劳器,并进入SYN_SEND状态,等待效劳器确认。第二次握手:效劳器收到syn包,必须确认客户的SYN〔ack=j+1〕,同时自己也发送一个SYN包〔syn=k〕,即SYN+ACK包,此时效劳器进入SYN_RECV状态。第三次握手:客户端收到效劳器的SYN+ACK包,向效劳器发送确认包ACK(ack=k+1),此包发送完毕,客户端和效劳器进入ESTABLISHED状态,完成三次握手。你在效劳端和客户端分别使用了哪些WinsockAPI函数,起什么作用?在效劳端使用了socket函数创立一个无名的TCP类型的套接字,使用了htons函数将参数从主机字节顺序转化到TCP/IP网络字节顺序,使用bind函数将创立的无名套接字绑定到本地地址,使用listen函数让套接字进入监听模式并制定最大连接数,使用accept函数接受连接请求并创立新的套接字,使用send函数向客户端发送数据,使用recv函数接受客户端发送的数据,使用inet_ntoa函数将32位的二进制数转化为了字符串,还使用了closesoket函数关闭制定的套接字。在客户端使用了socket函数创立一个无名的TCP类型的套接字,使用了htons函数将参数从主机字节顺序转化到TCP/IP网络字节顺序,使用connect函数向制定地址的效劳器端发送连接请求,使用send函数向客户端发送数据,使用recv函数接受客户端发送的数据,使用inet_ntoa函数将32位的二进制数转化为了字符串,使用inet_addr函数将字符串类型的IP地址转化为32为二进制数,还使用了closesoket函数关闭制定的套接字。五、实验者自评通过本次实验,对根本的windsockAPI函数的使用方法和实现原理有了更深入的了解,对TCP效劳器端和客户端编程有了更深刻的理解。在实验过程中,熟悉了网络编程方法,尤其是查阅资料并熟悉了TCP建立连接的三次握手过程,重新温习了对文件的操作,对自己的编程动手能力有了较好的锻炼和提高。六、附录:关键代码〔给出适当注释,可读性高〕客户端#include"stdio.h"#include<Winsock2.H>#pragmacomment(lib,"WS2_32.lib")intmain(intargc,char*argv[]){WSADATAwsd;//用于初始化WindowsSocketSOCKETsHost;//与效劳器进行通信的套接字SOCKADDR_INservAddr;//效劳器地址charbuf[1024];//用于接受数据缓冲区intretVal;//调用各种Socket函数的返回值//初始化WindowsSocketif(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartupfailed!\n");return1;}//创立套接字sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sHost){printf("socketfailed!\n");WSACleanup();return-1;}//设置效劳器地址servAddr.sin_family=AF_INET;servAddr.sin_addr.S_un.S_addr=inet_addr(argv[1]);//用户需要根据实际情况修改servAddr.sin_port=htons(atoi(argv[2]));//在实际应用中,建议将效劳器的IP地址和端口号保存在配置文件中intsServerAddlen=sizeof(servAddr);//计算地址的长度//连接效劳器printf("%s%d",argv[1],atoi(argv[2]));retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));if(retVal==SOCKET_ERROR){printf("调用connect函数时出错\n");closesocket(sHost);WSACleanup();system("pause");return-1;}printf("连接成功,开始通信\n");charstr[1024];while(true){//向效劳器发送数据printf("send:");gets(str);//将用户输入的数据复制到buf中ZeroMemory(buf,1024);strcpy(buf,str);//向效劳器发送数据retVal=send(sHost,buf,strlen(buf),0);if(SOCKET_ERROR==retVal){printf("sendfailed!\n");closesocket(sHost);WSACleanup();return-1;}//接收效劳器回传的数据retVal=recv(sHost,buf,sizeof(buf)+1,0);if(SOCKET_ERROR==retVal){printf("sendfailed!\n");closesocket(sHost);WSACleanup();return-1;}printf("server:%s\n\n",buf);//如果收到quit,那么退出if(strcmp(buf,"quit")==0){printf("quit!\n");break;}}//释放资源closesocket(sHost);WSACleanup();return0;}效劳器#include<WINSOCK2.H>#include<stdio.h>#pragmacomment(lib,"WS2_32.lib")intmain(intargc,char*argv[]){WSADATAwsd;//WSADATA变量,用于初始化WindowsSocketSOCKETsServer;//效劳器套接字,用于监听客户端请求SOCKETsClient;//客户端套接字,用于实现与客户端的通信intretVal;//调用各种Socket函数的返回值charbuf[1024];//用于接受客户端数据的缓冲区//初始化套接字动态库if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf("WSAStartupfailed!\n");return1;}//创立用于监听的套接字sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){printf("socketfailed!\n");WSACleanup();return-1;}//设置效劳器套接字地址SOCKADDR_INaddrServ;addrServ.sin_family=AF_INET;addrServ.sin_port=htons(1555);//监听端口为1555addrServ.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//htonl(INADDR_ANY);//绑定套接字sServer到本地地址,端口1555retVal=bind(sServer,(conststructsockaddr*)&addrServ,sizeof(SOCKADDR_IN));if(SOCKET_ERROR==retVal){printf("bindfailed!\n");closesocket(sServer);WSACleanup();return-1;}//监听套接字retVal=listen(sServer,3);if(SOCKET_ERROR==retVal){printf("listenfailed!\n");closesocket(sServer);WSACleanup();return-1;}//接受客户请求printf("TCP效劳程序已启动,连接中......");sockaddr_inaddrClient;//客户端地址intaddrClientlen=sizeof(addrClient);intcount=0;while(true){sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);if(INVALID_SOCKET==sClient){printf("acceptfailed!\n");break;}count++;printf("\n已连接%s:%d",inet_ntoa(addrClient.sin_addr),addrClient.sin_port);printf("当前连接数:%d\n",count)

温馨提示

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

评论

0/150

提交评论