您好,欢迎访问三七文档
华中科技大学《计算机网络》实验报告班级:________________学号:________________姓名:________________日期:________________华中科技大学电子信息与通信学院路由算法之RIP协议分析Socket编程实验一、实验目的1、掌握网络应用程序的开发方法;2、掌握Client/Server结构软件的设计与开发方法3、掌握Socket机制的工作原理二、实验环境Windows7.0,集成开发环境codeblocks,simple-talk例程代码三、实验原理1、Client/Server结构在TCP/IP网络环境下,不同主机上的两个应用程序间通信普遍采用客户机-服务器模型(client/serverarchitecture,C/S).即通信双方一方作为服务器等待客户提出请求并予以响应,客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络接口,一旦有客户请求,就启动一个服务进程来响应客户,同时自己继续监听服务端口,使后续客户也能及时得到服务。2、Windowssocket编程WindowsSockets是MicrosoftWindows的网络程序设计接口,通过该接口应用进程可以从另一个应用进程发送或者接收消息3、面向连接的同步模式编程(TCP阻塞编程)服务器首先启动,通过调用socket()建立一个套接口,然后bind()将该套接口和本地地址(IP地址和端口)绑定在一起,再listen()使得套接口做好侦听准备,并规定它的请求队列的长度,之后就调用accept()来接收连接,并获得客户机的地址信息;客户机在建立套接口之后就可以调用connect()和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用send()和recv()来发送和接收数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。面向连接的同步模式编程时序图如下四、实验内容及结果1、运行simplex-talk例程,理解代码并观察现象2、修改simplex-talk程序,编制duplex-talk程序,支持client和server的双向通信(1)程序整体功能Client端程序连接Server端程序,Client能给Server发送信息,同时Server也能给Client发送信息,实现双向通信;(2)程序由若干模块组成主要为检查模块,检查是否出错以及是否与服务器/客户端建立了链接;传输数据模块,客户端向服务器发送数据和接受服务器发送的消息以及服务器接收数据及发送数据;关闭连接模块,断开客户端与服务器的链接。重要的数据结构:WSADATA,hostent,sockaddr_in等数据结构;(3)程序流程图如下Client端Server端(4)程序的运行和测试结果编译源文件,生成可执行文件并运行,其过程如下:Client端Socket端server.exeserverisreadyinlistening...client.exelocalhostreceivedaconnectionfrom127.0.0.1:clientisconnectingtolocalhosthi!Serverhadreceivedfromclient:hi!Hello!Clienthadreceivedfromserver:Hello!Howareyou?Serverhadreceivedfromclient:Howareyou?I’mfine,thanks,andyou?Clienthadreceivedfromserver:I’mfine,thanks,andyou?I’mfine,tooServerhadreceivedfromclient:I’mfine,too运行结果如下ClientServer3.利用windows时间函数,编制一个简单的定时器,模拟client和server之间的stop-and-wait的动作程序整体功能:实现客户端与服务器之间的stop-and-wait动作,其中延时设置为2s,主要实现方法为server收到client发过来的数据后不回传ACK,导致client以为server没有收到,然后在延时过后重传数据;程序组成及各模块功能:程序由若干模块组成,主要为检查模块,检查是否出错以及是否与服务器/客户端建立了链接;传输数据模块,客户端向服务器发送数据和接受服务器发送的消息以及服务器接收数据及发送数据;关闭连接模块,断开客户端与服务器的链接;重要的数据结构:WSADATA,hostent,sockaddr_in等数据结构;运行结果如下:五、实验小结(1)经过本次实验,基本了解了Client/Server结构软件的设计与开发方法,理解了Socket机制的工作原理。(2)刚开始时示例代码看不懂,花了大量的时间和精力,没有弄明白函数参量的具体意义,导致整个实验都不是很清楚。(3)在同学的帮助下我弄明白了这个程序的的大致模块分布和一些基本的算法思想,并且参考了大量代码,其中还咨询了一些同学之后有了一个整个的思路。(4)在编写代码的过程中,出现了许多错误,不知道一些函数如何使用,在参考了同学的代码之后,总算有了一点头绪。后面服务器接口的使用也困扰了好久,后面经提醒才知道,服务器用于连接请求和数据传输的端口要分开使用。服务器开放一个接口(s)用于监听来自客户端的连接请求,在建立连接后,会另外开放一个接口(new_s)用于和客户端通信,而原先的接口则用来处理其他客户端的连接请求。六、附录(1)socket-client.c/*requiredforwindowssocketprogramming*/#includewinsock.h#pragmacomment(lib,wsock32.lib)#includestdio.h#includestring.h#defineSERVER_PORT5432#defineMAX_BUFSIZE256intmain(intargc,char*argv[]){/*requiredforwindowssocketprogramming*/WSADATAWSAData;intWSAreturn;/*uselesspointer*/structhostent*hp;structsockaddr_insin;char*host;charbufIn[MAX_BUFSIZE],bufOut[MAX_BUFSIZE];ints,new_s;intlen;intableToSendMsg=1;//Thisvariableactsasaflagtosendandreceivemessagehost=localhost;/*modifiedforwindowssocketprogramming*/WSAreturn=WSAStartup(0x101,&WSAData);if(WSAreturn){fprintf(stderr,simplex-talk:WSAerror.\n);exit(1);}/*translatehostnameintopeer'sIPaddress*/hp=gethostbyname(host);if(!hp){fprintf(stderr,simplex-talk:unknownhost:%s\n,host);exit(1);}/*buildaddressdatastructure*/memset((char*)&sin,0,sizeof(sin));memcpy((char*)&sin.sin_addr,hp-h_addr,hp-h_length);sin.sin_family=AF_INET;sin.sin_port=htons(SERVER_PORT);/*activeopen*/if((s=socket(PF_INET,SOCK_STREAM,0))0){perror(simplex-talk:socketfailed.);exit(1);}if(connect(s,(structsockaddr*)&sin,sizeof(sin))0){perror(simplex-talk:connectfailed.);/*modifiedforwindowssocketprogramming*/closesocket(s);exit(1);}/*displayingcurrentstatus*/printf(connectionto%sisready\n,host);printf(pleaseinputyourmessage(emptyinputtohalt):\n);/*mainloop:getandsendlinesoftext*/while(1){if(ableToSendMsg){//SendMessgagefgets(bufIn,sizeof(bufIn),stdin);/*modifiedtostopsending*/if(strlen(bufIn)==1){/*userinputemptymessagewith'\n'*/bufIn[0]='\0';send(s,bufIn,1,0);printf(emptymessageissendtoserver\n);break;}else{bufIn[MAX_BUFSIZE-1]='\0';len=strlen(bufIn)+1;send(s,bufIn,len,0);printf(send%dcharstoserver\n\n,strlen(bufIn));ableToSendMsg=0;}}else{//ReceiveMessagelen=recv(s,bufOut,sizeof(bufOut),0);///*modifiedtostopsending*/if(strlen(bufOut)==0){/*receivedemptymessage*/printf(emptymessageisreceived\n);break;}else{printf(received%dchars\n,strlen(bufOut));fputs(bufOut,stdout);printf(\n);ableToSendMsg=1;}}}printf(connectionisterminated\n);/*modifiedforwindowssocketprogramming*/WSACleanup();return1;}Socket-server.c/*requiredforwindowssocketprogramming*/#includewinsock.h#pragmacomment(lib,wsock32.lib)#includestdio.h#includestring.h#defineSERVER_PORT5432#defineMAX_PENDING5#defineMAX_BUFSIZE256#defineMAX_CONNECTION3intmain(){/*requiredforwindowssocketprogramming*/WSADATAWSAData;intWSAreturn;structsockaddr_insin;charbufIn[MAX_BUFSIZE],bufOut[MAX_BUFSIZE];intlen;ints,new_s;intableToSendMsg=0;//Thisvariableactsasaflagtosendandreceivemessage/*connections*/intconn;/*requiredforwindowssocketprogramming*/WSAreturn=WSAStartup(0x101,&WSAData);if(WSAreturn){fprintf(stderr,simplex-talk:WSAerror.\n);exit(1);}/*buildaddressdatastru
本文标题:SCOCK编程
链接地址:https://www.777doc.com/doc-6889391 .html