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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

return 0; main()
SOCKET server; SOCKET client; SOCKADDR_IN ser_addr,cli_addr; WSADATA wdata; int cliaddrLen=0; UINT port=4000; HANDLE Hnd; DWORD dwThreadID; if(WSAStartup(MAKEWORD(2,0),&wdata)!=0) { OutErr(string( "WSAStartup ")); return 1; } 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))==INVAL if((server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==INVALID_SOCKET) { OutErr(string( "WSASocket ")); return 1; } if(bind(server,(SOCKADDR *)&ser_addr,sizeof(SOCKADDR))!=0) { OutErr(string( "bind ")); return 1; } if(listen(server,5)!=0) { OutErr(string( "listen ")); return 1; } while(1)
测试结果:
心得体会: 通过这次的实验,巩固了我以前基础的java知识,了解Socket类与ServerSocket类的 会用一些Socket类与ServerSocket类的重要方法,初步了解java中用来实现客户端TCP操作 这个类本身使用直接代码通过主机操作系统的本地TCP栈进行通信。
实验报告
学院(系)名称:计算机与通信工程学院 姓名 学号 班级 课程名称 实验时间 批改意见 实验名称 计算机网络 专业 实验二:基于TCP/UDP的Socket编程 课程代码 实验地点 成绩
1. 实验目的 了解套接字(socket)实现原理。通过编成理解TCP、UDP原理,加深对传输层的功能理 2. 实验环境 Windows 7 3. 实验要求 请在以下题目中选择一个,按照要求完成实验,并完成实验报告。实验可以分组进行 组,在报告中注明每个成员的分工。编程可以使用任何高级语言,建议使用java或C+ (1)基于TCP / UDP的socket编程 a) 利用Java或C++语言,分别基于TCP和UDP编写一个简单的Client/Server网络应用程序 户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。 b) 修改上述程序,实现wk.baidu.com务器根据客户请求,将服务器端指定的文件可靠地传输给客 器没有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。 4. 实验过程记录(源程序、测试用例、测试结果及心得体会等) 源程序: (1)服务端: //server.cpp #include <winsock2.h> #include <io.h> #include <windows.h> #include <iostream> #include <string> #pragma comment(lib, "WS2_32.lib ") using namespace std;
void OutErr(string msg) cout << "错误!发生在 " <<msg <<endl; } fd_set fdread; ret; DWORD WINAPI ThreadProc(LPVOID lpParameter) SOCKET c=(SOCKET)lpParameter; char data[80]; UINT ReciveBytes=0; FD_ZERO(&fdread); FD_SET(c,&fdread); do { if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR) { OutErr(string( "select ")); break; } if(ret> 0) { if(FD_ISSET(c,&fdread)) { ReciveBytes=recv(c,data,10,0); if(ReciveBytes==SOCKET_ERROR) { break; } cout << "收到字节数: " <<ReciveBytes <<endl; data[ReciveBytes]= '\0 '; cout <<data <<endl; } } }while(ReciveBytes> 0); FD_CLR(c,&fdread); closesocket(c);
if((c=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))==INVALID_SOC OutErr(string( "WSASocket ")); return 1; 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 ")); return 1;
SentBytes; cin>> msg; if(msg== "exit ")break; if((SentBytes=send(c,msg.c_str(),msg.size(),0))==SOCKET_ERROR) OutErr(string( "send ")); break; }while(1); closesocket(c); WSACleanup(); return 0;
WSADATA wsd; string msg; string remote_ip; cout << "输入对方IP地址: "; cin>> remote_ip; if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) OutErr(string( "WSAStartup ")); return 1;
data[ReciveBytes]=0;//加上结束符 cout << "收到 " <<ReciveBytes << "个字节:\n " <<data <<endl; }while(ReciveBytes> 0); } } }//while接收数据 if(Hnd==NULL) { CloseHandle(Hnd); closesocket(client); } } closesocket(server); WSACleanup(); return 0; 客户端: //client.cpp #include <iostream> #include <winsock2.h> #include <string> #pragma comment(lib, "ws2_32.lib ") using namespace std; void OutErr(string msg) cout << "错误发生: " <<msg <<endl; main() SOCKET c; SOCKADDR_IN server_addr;
{ cliaddrLen=sizeof(SOCKADDR); client=accept(server,(SOCKADDR *)&cli_addr,&cliaddrLen); cout << "客户IP: " <<inet_ntoa(cli_addr.sin_addr) << ",端口: " <<ntohs(cli_addr.sin_port) <<endl; ULONG ul=1; if(ioctlsocket(client,FIONBIO,&ul)==SOCKET_ERROR) { OutErr(string( "ioctlsocket ")); return 1; } FD_ZERO(&fdread);//清空集合 FD_SET(client,&fdread);//将C加入到读取集合中 //Hnd=CreateThread(NULL,0,ThreadProc,(LPVOID)client,0,&dwThreadID); //接收数据 while(TRUE) { char data[11]; int ReciveBytes; //这里阻断程序,知道缓冲区内有可读数据才返回 if((ret=select(0,&fdread,NULL,NULL,NULL))==SOCKET_ERROR) { //套接字错误 break; } if(ret> 0) { if(FD_ISSET(client,&fdread))//c中是否属于fdread集合 { do//循环读取,每次接收10个字符,直到把缓冲区中全部取完 { ReciveBytes=recv(client,data,10,0); if(ReciveBytes==SOCKET_ERROR) { //SOCKET错误 break; }
相关文档
最新文档