天津理工大学计算机网络-实验二

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第1页共6页实验报告学院(系)名称:计算机与通信工程学院姓名学号专业计算机科学与技术班级实验名称实验二:基于TCP/UDP的Socket编程课程名称计算机网络课程代码实验时间实验地点7#219批改意见成绩教师签字:1.实验目的了解套接字(socket)实现原理。通过编成理解TCP、UDP原理,加深对传输层的功能理解。2.实验环境Windows73.实验要求请在以下题目中选择一个,按照要求完成实验,并完成实验报告。实验可以分组进行,每2人一组,在报告中注明每个成员的分工。编程可以使用任何高级语言,建议使用java或C++。(1)基于TCP/UDP的socket编程a)利用Java或C++语言,分别基于TCP和UDP编写一个简单的Client/Server网络应用程序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。b)修改上述程序,实现服务器根据客户请求,将服务器端指定的文件可靠地传输给客户。如果服务器没有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。4.实验过程记录(源程序、测试用例、测试结果及心得体会等)源程序:(1)服务端://server.cpp#includewinsock2.h#includeio.h#includewindows.h第2页共6页#includeiostream#includestring#pragmacomment(lib,WS2_32.lib)usingnamespacestd;voidOutErr(stringmsg){cout错误!发生在msgendl;}fd_setfdread;intret;DWORDWINAPIThreadProc(LPVOIDlpParameter){SOCKETc=(SOCKET)lpParameter;chardata[80];UINTReciveBytes=0;FD_ZERO(&fdread);FD_SET(c,&fdread);do{if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR){OutErr(string(select));break;}if(ret0){if(FD_ISSET(c,&fdread)){ReciveBytes=recv(c,data,10,0);if(ReciveBytes==SOCKET_ERROR){break;}cout收到字节数:ReciveBytesendl;data[ReciveBytes]='\0';coutdataendl;}}}while(ReciveBytes0);FD_CLR(c,&fdread);closesocket(c);return0;}intmain(){第3页共6页SOCKETserver;SOCKETclient;SOCKADDR_INser_addr,cli_addr;WSADATAwdata;intcliaddrLen=0;UINTport=4000;HANDLEHnd;DWORDdwThreadID;if(WSAStartup(MAKEWORD(2,0),&wdata)!=0){OutErr(string(WSAStartup));return1;}ser_addr.sin_addr.S_un.S_addr=inet_addr(0.0.0.0);ser_addr.sin_family=AF_INET;ser_addr.sin_port=htons(port);//if((server=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET)if((server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET){OutErr(string(WSASocket));return1;}if(bind(server,(SOCKADDR*)&ser_addr,sizeof(SOCKADDR))!=0){OutErr(string(bind));return1;}if(listen(server,5)!=0){OutErr(string(listen));return1;}while(1){cliaddrLen=sizeof(SOCKADDR);client=accept(server,(SOCKADDR*)&cli_addr,&cliaddrLen);cout客户IP:inet_ntoa(cli_addr.sin_addr),端口:ntohs(cli_addr.sin_port)endl;ULONGul=1;if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR){OutErr(string(ioctlsocket));return1;}FD_ZERO(&fdread);//清空集合第4页共6页FD_SET(client,&fdread);//将C加入到读取集合中//Hnd=CreateThread(NULL,0,ThreadProc,(LPVOID)client,0,&dwThreadID);//接收数据while(TRUE){chardata[11];intReciveBytes;//这里阻断程序,知道缓冲区内有可读数据才返回if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR){//套接字错误break;}if(ret0){if(FD_ISSET(client,&fdread))//c中是否属于fdread集合{do//循环读取,每次接收10个字符,直到把缓冲区中全部取完{ReciveBytes=recv(client,data,10,0);if(ReciveBytes==SOCKET_ERROR){//SOCKET错误break;}data[ReciveBytes]=0;//加上结束符cout收到ReciveBytes个字节:\ndataendl;}while(ReciveBytes0);}}}//while接收数据if(Hnd==NULL){CloseHandle(Hnd);closesocket(client);}}closesocket(server);WSACleanup();return0;}第5页共6页客户端://client.cpp#includeiostream#includewinsock2.h#includestring#pragmacomment(lib,ws2_32.lib)usingnamespacestd;voidOutErr(stringmsg){cout错误发生:msgendl;}intmain(){SOCKETc;SOCKADDR_INserver_addr;WSADATAwsd;stringmsg;stringremote_ip;cout输入对方IP地址:;cinremote_ip;if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){OutErr(string(WSAStartup));return1;}if((c=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOCKET){OutErr(string(WSASocket));return1;}server_addr.sin_addr.S_un.S_addr=inet_addr(remote_ip.c_str());server_addr.sin_family=AF_INET;server_addr.sin_port=htons(4000);if(connect(c,(SOCKADDR*)&server_addr,sizeof(SOCKADDR_IN))!=0){OutErr(string(connect));return1;}do{intSentBytes;cinmsg;if(msg==exit)break;第6页共6页if((SentBytes=send(c,msg.c_str(),msg.size(),0))==SOCKET_ERROR){OutErr(string(send));break;}}while(1);closesocket(c);WSACleanup();return0;}测试结果:心得体会:通过这次的实验,巩固了我以前基础的java知识,了解Socket类与ServerSocket类的作用与用法,会用一些Socket类与ServerSocket类的重要方法,初步了解java中用来实现客户端TCP操作Socket类,这个类本身使用直接代码通过主机操作系统的本地TCP栈进行通信。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功