下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、网络编程技术实验报告实验名称实验四 基于数据报套接字的回射程序设计与实验队别姓 名 学 号 实验日期 2015.12.9实验报告要求: 1. 实验目的 2. 实验要求 3. 实验环境 4. 实验作业 5. 问题及解决6. 思考问题 7. 实验体会【实验目的】1. 巩固套接字编程2. 熟悉流式套接字编程【实验要求】 使用流式套接字编程实现回射程序,具体包括: 1. 客户端:主动请求建立连接,接收界面输入字符串,发送数据给服务器,接收服务器返回的应答, 输出显示。2. 服务器: 在指定端口上提供服务, 接收客户端的发送的回射请求字符串, 将接收到的内容回射给客 户端,输出显示。3. 提炼出网络操作
2、的基本功能,构造网络操作类,修改原有程序【实验环境】DEV C+【实验作业】网络操作类设计:class CSocketFramepublic:int start_up();int clean_up();int set_address(char *hname,char *sname,struct sockaddr_in *sap,char *protocol);int quit(SOCKET s);SOCKET tcp_server(ULONG uIP,USHORT uPort);SOCKET tcp_server(char *hname,char *sname);SOCKET tcp_clie
3、nt(char *hname,char *sname);SOCKET tcp_client(ULONG uIP,USHORT uPort);int CSocketFrame:start_up(void)WORD wVersionRequested;WSADATA wsaData;int iResult; wVersionRequested=MAKEWORD(2,2); iResult=WSAStartup(wVersionRequested,&wsaData);if(iResult!=0)printf("WSAStartup 调用错误,错误号 :%dn",WSAGe
4、tLastError(); return -1;/*if(LOBYTE(wsaData.wVersion!=2|HIBYTE(wsaData.wVersion)!=2) printf(" 无法找到可用的 WSD版本 n");WSACleanup();return -1;/ 告诉用户无法找到可用的 WSDelse printf("WS2.2 初始化成功! n"); */return 0;int CSocketFrame:clean_up(void)int iResult; iResult=WSACleanup();if(iResult=SOCKET_ERR
5、OR) /WSACleanup() 调用失败 printf("WSACleanup 调用错误,错误号 :%dn",WSAGetLastError();return -1;else printf("Winsocket dll 释放成功! n") ;return 0;*protocol)int CSocketFrame:set_address(char *hname,char *sname,struct sockaddr_in *sap,char struct servent *sp;struct hostent *hp;char *endptr;unsig
6、ned short port;unsigned long ulAddr=INADDR_NONE;/ 将地址结构 socketsddr_in 初始化为 0,并将地址族设为 AF_INET memset(sap,0,sizeof(*sap);sap->sin_family=AF_INET; if(hname!=NULL)/ 如果 hname 不为空,转化地址格式ulAddr=inet_addr(hname); if(ulAddr=INADDR_NONE|ulAddr=INADDR_ANY) / 调用错误,调用 gethostbyname 获得主机地址 hp=gethostbyname(hna
7、me);if(hp=NULL)printf(" 未知的主机名,错误号: %dn",WSAGetLastError();return -1; sap->sin_addr=*(struct in_addr *)hp->h_addr;elsesap->sin_addr.S_un.S_addr=ulAddr;else/ 如果调用者没有指明一个主机名或地址,则设为通配地址 sap->sin_addr.s_addr=htonl(INADDR_ANY);/ 尝试转换 sname 为一个整数port=(unsigned short)strtol(sname,&
8、;endptr,0);if(*endptr='0')/ 如果成功转化为网络字节序 sap->sin_port=htons(port);else/ 如果失败,则假定是一个服务名称,通过 getservbyname() 函数获得端口号 sp=getservbyname(sname,protocol);if(sp=NULL)printf(" 未知服务,错误号: %dn",WSAGetLastError(); return -1; sap->sin_port=sp->s_port;return 0;int CSocketFrame:quit(SOC
9、KET s)int iResult=0;iResult=closesocket(s); if(iResult=SOCKET_ERROR)printf("closesocket 调用错误,错误号 :%dn",WSAGetLastError(); return -1; iResult=clean_up(); return iResult;SOCKET CSocketFrame:tcp_server(char *hname,char *sname)SOCKET ListenSocket;int iResult=0; sockaddr_in local;const int on=1
10、;/ 为服务器的本机地址设置用户输入的地址以及端口号 if(set_address(hname,sname,&local,(char*)"tcp")!=0) return -1;/ 创建套接字 ListenSocket=socket(AF_INET,SOCK_STREAM,0); if(ListenSocket=INVALID_SOCKET)printf("socket 函数调用错误,错误号: %dn",WSAGetLastError(); WSACleanup();return -1;/ 绑定服务器地址 iResult=bind(ListenS
11、ocket,(struct sockaddr *) & local,sizeof(local); if(iResult=-1)printf("bind 函数调用错误!错误号: %dn",WSAGetLastError(); closesocket(ListenSocket);WSACleanup();return -1;/ 设置函数为监听状态,监听队列长度为 NLISTEN iResult=listen(ListenSocket,SOMAXCONN);if(iResult=SOCKET_ERROR)printf("Listen 函数调用错误!错误号: %d
12、n",WSAGetLastError(); quit(ListenSocket);return -1;return ListenSocket;SOCKET CSocketFrame:tcp_server(ULONG uIP,USHORT uPort)SOCKET ListenSocket=INVALID_SOCKET;int iResult=0;sockaddr_in local;const int on=1;/ 为服务器的本机地址设置用户输入的地址以及端口号 memset(&local,0,sizeof(local);local.sin_family=AF_INET; lo
13、cal.sin_addr.S_un.S_addr=htonl(uIP);local.sin_port=htons(uPort);ListenSocket=socket(AF_INET,SOCK_STREAM,0); if(ListenSocket=INVALID_SOCKET)printf("socket 函数调用错误,错误号: %dn",WSAGetLastError(); clean_up();return -1;/ 绑定服务器地址iResult=bind(ListenSocket,(struct sockaddr *) & local,sizeof(local
14、); if(iResult=SOCKET_ERROR)printf("bind 函数调用错误!错误号: %dn",WSAGetLastError(); quit(ListenSocket);return -1;/ 设置函数为监听状态,监听队列长度为 NLISTEN iResult=listen(ListenSocket,SOMAXCONN); if(iResult=SOCKET_ERROR)printf("Listen 函数调用错误!错误号: %dn",WSAGetLastError(); quit(ListenSocket);return -1;ret
15、urn ListenSocket;SOCKET CSocketFrame:tcp_client(char *hname,char *sname)int iResult=0;struct sockaddr_in peer;SOCKET ClientSocket;/ 为服务器的地址 peer 设置用户输入的地址以及端口号 if(set_address(hname,sname,&peer,(char *)"tcp")!=0) return -1;/ 创建套接字ClientSocket=socket(AF INET,SOCK STREAM,0);if(ClientSocke
16、t=INVALID_SOCKET)printf("socket 函数调用错误,错误号: %dn",WSAGetLastError(); clean_up();return -1;/ 请求建立连接 iResult=connect(ClientSocket,(struct sockaddr *) & peer,sizeof(peer); if(iResult=SOCKET_ERROR)printf("connect 函数调用错误!错误号: %dn",WSAGetLastError(); quit(ClientSocket);return -1;ret
17、urn ClientSocket;SOCKET CSocketFrame:tcp_client(ULONG uIP,USHORT uPort)int iResult=0;struct sockaddr_in peer;SOCKET ClientSocket;/ 为服务器的地址 peer 设置用户输入的地址以及端口号 memset(&peer,0,sizeof(peer);peer.sin_family=AF_INET; peer.sin_addr.S_un.S_addr=htonl(uIP);peer.sin_port=htons(uPort);/ 创建套接字 ClientSocket
18、=socket(AF_INET,SOCK_STREAM,0); if(ClientSocket=INVALID_SOCKET)printf("socket 函数调用错误,错误号: %dn",WSAGetLastError(); clean_up();return -1; / 请求建立连接 iResult=connect(ClientSocket,(struct sockaddr *) & peer,sizeof(peer); if(iResult=SOCKET_ERROR)printf("connect 函数调用错误!错误号: %dn",WSAG
19、etLastError(); quit(ClientSocket);return -1;return ClientSocket;服务器代码设计: #define MAXLINE 10000 #define ECHOPORT "7210" int tcp_server_fun_echo(SOCKET s)int iResult = 0;char recvlineMAXLINE;do memset(recvline, 0, MAXLINE);/ 接收数据iResult = recv(s, recvline, MAXLINE, 0);if (iResult > 0)prin
20、tf(" 服务器接收到数据: %sn", recvline);/ 回射程序已经收到的数据 iResult = send(s, recvline, iResult, 0); if (iResult = SOCKET_ERROR) printf("send 函数调用错误,错误号: %ldn", WSAGetLastError(); iResult = -1;elseprintf(" 服务器发送数据 %sn", recvline);elseif (iResult = 0)printf(" 对方连接关闭,退出 n"); e
21、lseprintf("recv 函数调用错误,错误号: %dn", WSAGetLastError(); iResult = -1; break; while (iResult > 0);return iResult;int main(int argc, char* argv)CSocketFrame frame;int iResult = 0;SOCKET ListenSocket, ConnectSocket;/ 输入参数合法性检查 if (argc != 1) printf("usage:EchoTCPServer"); return -1;
22、 / 初始化 frame.start_up();/ 创建服务器的流式套接字并在指定端口号上监听ListenSocket =frame.tcp_server(char *)NULL,(char *)ECHOPORT); /改成全部任意if (ListenSocket = -1)return -1;printf(" 服务器准备好回射服务。 n");for (;)ConnectSocket = accept(ListenSocket, NULL, NULL);if (ConnectSocket != INVALID_SOCKET)/ 建立连接成功 printf("rn
23、建立连接成功 nn");/ 回射iResult = tcp_server_fun_echo(ConnectSocket);/ 如果出错,关闭当前连接的套接字,继续接受其他客户端的请求if (iResult = -1)printf(" 当前连接已关闭或出错! n");elseprintf("accept 函数调用错误,错误号: %dn", WSAGetLastError(); frame.quit(ListenSocket);return -1;/ 关闭套接字if (closesocket(ConnectSocket) = SOCKET_ERRO
24、R) printf("closesocket 函数调用错误,错误号: %dn", WSAGetLastError(); frame.quit(ListenSocket);return 0;客户端代码设计:#define ECHOPORT "7210"#define MAXLINE 10000 int tcp client fun echo(FILE *fp,SOCKET s)int iResult;char sendlineMAXLINE,recvlineMAXLINE;/ 初始化缓冲区 memset(sendline,0,MAXLINE);memset
25、(recvline,0,MAXLINE);/ 循环发送用户输入的数据,并接受服务器返回的应答,直到用户输入 Q结束 while(fgets(sendline,MAXLINE,fp)!=NULL)if(*sendline='Q')printf("input end!n");/ 用户发送数据结束 iResult=shutdown(s,SD_SEND); if(iResult=SOCKET_ERROR) printf("shutdown 函数调用错误,错误号: %d",WSAGetLastError(); return 0; iResult=s
26、end(s,sendline,strlen(sendline),0); if(iResult=SOCKET_ERROR)printf("send 函数调用错误,错误号: %d",WSAGetLastError(); return -1;printf("rn 客户端发送数据: %srn",sendline); memset(recvline,0,MAXLINE);iResult=recv(s,recvline,MAXLINE,0);if(iResult>0)printf(" 客户端收到数据: %srn",recvline);else if(iResult=0) printf(" 服务器终止! n"); else printf("recv 函数调用错误,错误号: %d",WSAGetLastError(); break;memset(sendline,0,MAXLINE);return iResult;int main(int argc,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年天津滨海职业学院单招职业技能测试题库附答案解析
- 2026年安徽审计职业学院单招职业适应性测试题库带答案解析
- 2026年山东省日照市单招职业倾向性考试题库附答案解析
- 2026年浙江农业商贸职业学院单招职业倾向性考试题库及答案解析(夺冠系列)
- 2026年山东畜牧兽医职业学院单招职业倾向性考试必刷测试卷及答案解析(名师系列)
- 2026年德阳农业科技职业学院单招职业技能考试必刷测试卷及答案解析(名师系列)
- 2026年江西机电职业技术学院单招综合素质考试题库附答案解析
- 房屋指标转让协议书
- 房屋改造分包协议书
- 房屋木工施工协议书
- 医学教育信息化融合实践路径
- 火灾安全课课件
- 2026-2031中国电线电缆市场投资分析及未来发展规划建议报告
- 国家宪法日知识竞赛试题库(含答案)
- 2025年国际私法试题及答案
- 亚马逊进货合同范本
- 高速公路隧道爆破工程安全专项施工方案
- 重症医学科急性呼吸衰竭护理方案
- 2025版静脉治疗护理技术解读
- 2025四川成都环境投资集团有限公司下属成都国资国企改革发展研究院有限责任公司招聘产业研究岗等岗位4人考试笔试参考题库附答案解析
- 2025年青海省西宁市中考数学数学试卷(附答案解析)
评论
0/150
提交评论