版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、设计目的和要求1、实验目的通过本次专业设计使学生更进一步掌握计算机网络编程的有关知识〔包括TCP报文格式,TCP通信过程〕,加深对计算机网络编程知识的理解。2、实验要求设置效劳器和客户机,通过建立TCP连接,实现效劳器和客户机之间相互通信。二、设计说明设计分析:效劳器和客户机根据TCP协议建立连接,另外在效劳器和客户机端分别设置一个线程用于接收信息,以实现全双工通信。系统运行环境:windows7操作系统,VS2023设计中的重点和难点:理解TCP通信双方建立连接的过程三、系统详细设计程序流程图:开始创立socker开始创立socker连接请求监听关闭开始创立socker绑定关闭创立socker创立socker客户机绑定绑定通信四、程序源代码及注释效劳器:#include<WINSOCK2.H>#include<stdio.h>#definePORT6000//效劳器端口#defineMSGSIZE1024//收发缓冲区的大小#pragmacomment(lib,"ws2_32.lib")/*链接到WS2_32.lib,ws2_32.lib文件,提供了对网络相关API的支持*/DWORDWINAPIFunThread(LPVOID);//创立一个线程,专门用来接收数据/*填充sockaddr_in结构,此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息*/SOCKETsListen;//监听套接字SOCKETsClient;SOCKADDR_INclient;//保存客户的地址信息intiaddrSize=sizeof(SOCKADDR_IN);intmain(){WSADATAwsaData;/*这个结构被用来存储被WSAStartup函数调用后返回的WindowsSockets数据*/chars_Message[MSGSIZE];//收发缓冲区WSAStartup(0x0202,&wsaData);/*调用全局函数;即WSA(WindowsSocKNDsAsynchronous,Windows异步套接字)的启动命令;第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息,第二个参数指向WSADATA数据结构的指针*/sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);/*第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;第二个参数指定要创立的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部;第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。该函数如果调用成功就返回新创立的套接字的描述符,如果失败就返回INVALID_SOCKET*/if(sListen==INVALID_SOCKET){printf("Failedsocket()\n"); return0;}/*填充sockaddr_in结构,此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息*/SOCKADDR_INlocal;local.sin_family=AF_INET;//AF_INET指明使用TCP/IP协议族local.sin_port=htons(PORT);//指明连接效劳器的端口号local.sin_addr.s_addr=htonl(INADDR_ANY);//自动获取本机地址if(bind(sListen,(structsockaddr*)&local,sizeof(SOCKADDR_IN))==SOCKET_ERROR)/*第一个参数是一个套接字。第二个参数是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号,第三个参数确定sListen缓冲区的长度。返回值:如果函数执行成功,返回值为0,否那么为SOCKET_ERROR。*/{ printf("Failedbind()\n");return0;}if(listen(sListen,1)==SOCKET_ERROR)/*第一个参数是一个已绑定未被连接的套接字描述符,第二个参数是连接请求队列的最大长度〔一般由2到4〕。用SOMAXCONN那么由系统确定。返回值:无错误,返回0,否那么,返回SOCKETERROR,可以调用函数WSAGetLastError取得错误代码。*/{printf("Failedlisten()\n");return0;}sClient=accept(sListen,(structsockaddr*)&client,&iaddrSize);/*效劳程序调用accept函数从处于监听状态的流套接字sListen的客户连接请求队列中取出排在最前的一个客户请求,并且创立一个新的套接字来与客户套接字创立连接通道,如果连接成功,就返回新创立的套接字的描述符,以后与客户套接字交换数据的是新创立的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回所连接的客户进程的协议地址〔由addr指针所指〕;操作系统利用第三个参数来返回该地址〔参数二〕的大小*/printf("Accepteclient:%s:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));/*inet_ntoa将一个IP转换成一个互联网标准点分格式的字符串,ntohs将一个无符号短整形数从网络字节顺序转换为主机字节顺序*/HANDLEhThread=CreateThread(NULL,0,FunThread,0,0,0);/*第一个参数是指向平安属性的指针,NULL就行,第二个参数是初始线程堆栈大小,0就可以,WINDOWS会自动分配,第三个参数指向线程函数,必须是这样DWORDWINAPIThreadProc(LPVOIDpParam)第四个参数是传给线程函数的参数,有就传,没有就NULL,第五个参数是线程启动方式,可以是挂起CREATE_SUSPENDED,或者马上启动NULL,最后一个参数是创立的线程ID。*/CloseHandle(hThread);while(TRUE){printf("ServerSend:");//从键盘输入gets(s_Message);//发送数据send(sClient,s_Message,strlen(s_Message),0);/*向一个已连接的套接口发送数据。sClient是一个用于标识已连接套接口的描述字。s_Message包含待发送数据的缓冲区。strlen(s_Message)缓冲区中数据的长度。0调用执行方式。*/}return0;}DWORDWINAPIFunThread(LPVOID)//接受线程函数{charc_Message[MSGSIZE];intret;//接收字节的个数while(TRUE){ret=recv(sClient,c_Message,MSGSIZE,0);/*从一个套接口接收数据。sClient:一个标识已连接套接口的描述字。c_Message:用于接收数据的缓冲区。MSGSIZE:缓冲区长度。0:指定调用方式。该函数返回值是接收到的字节数*/if(ret==SOCKET_ERROR){printf("\nclientisclosed!");sClient=accept(sListen,(structsockaddr*)&client,&iaddrSize);//重新开始监听printf("\nAcceptenewclient:%s:%d",inet_ntoa(client.sin_addr),ntohs(client.sin_port));memset(c_Message,0,1024);//将原来的clientmessage归零,将c_Message中前1024个字节用0代替continue;}c_Message[ret]='\0';printf("\nReceived:%s\n",c_Message);}return0;}客户端:#include<WINSOCK2.H>#include<stdio.h>#defineSERVER_ADDRESS"127.0.0.1"//效劳器端IP地址#definePORT6000#defineMSGSIZE1024#pragmacomment(lib,"ws2_32.lib")/*链接到WS2_32.lib,ws2_32.lib文件,提供了对网络相关API的支持*/DWORDWINAPIFunThread(LPVOID);SOCKETsClient;SOCKADDR_INserver;//保存效劳器的地址信息intmain(){WSADATAwsaData;/*这个结构被用来存储被WSAStartup函数调用后返回的WindowsSockets数据*/charc_Message[MSGSIZE];//收发缓冲区WSAStartup(0x0202,&wsaData);/*调用全局函数;即WSA(WindowsSocKNDsAsynchronous,Windows异步套接字)的启动命令;第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息,第二个参数指向WSADATA数据结构的指针*/ sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);memset(&server,0,sizeof(SOCKADDR_IN));/*先将保存地址的server置为全0*/server.sin_family=PF_INET;//声明地址格式是TCP/IP地址格式server.sin_port=htons(PORT);//指明连接效劳器的端口号server.sin_addr.s_addr=inet_addr(SERVER_ADDRESS);/*指明连接效劳器的IP地址*/connect(sClient,(structsockaddr*)&server,sizeof(SOCKADDR_IN));/*连到刚刚指明的效劳器上*/HANDLEhThread=CreateThread(NULL,0,FunThread,0,0,0);/*第一个参数是指向平安属性的指针,NULL就行,第二个参数是初始线程堆栈大小,0就可以,WINDOWS会自动分配,第三个参数指向线程函数,必须是这样DWORDWINAPIThreadProc(LPVOIDpParam)第四个参数是传给线程函数的参数,有就传,没有就NULL,第五个参数是线程启动方式,可以是挂起CREATE_SUSPENDED,或者马上启动NULL,最后一个参数是创立的线程ID。*/CloseHandle(hThread);while(TRUE){printf("ClientSend:");gets(c_Message);//从键盘输入信息send(sClient,c_Message,strlen(c_Message),0);//发送信息if(!strcmp(c_Message,"exit"))//client自身退出exit(1);//正常退出}//释放连接和进行结束工作closesocket(sClient);WSACleanup();return0;}DWORDWINAPIFunThread(LPVOID){chars_Mess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 氢气专项施工方案(3篇)
- 沟渠围挡施工方案(3篇)
- 厂房总施工方案(3篇)
- 中秋售卖活动策划方案(3篇)
- 制作柜子施工方案(3篇)
- 零售行业库存管理指南(标准版)
- 培训机构如何续班
- 2025年中职数控管理(管理技术)试题及答案
- 2025年大学单板滑雪平行大回转运动与管理(平行大回转技术)试题及答案
- 2025年高职会计(高级财务会计)试题及答案
- 2025年山西省中考英语试卷真题(含答案详解)
- TD/T 1036-2013土地复垦质量控制标准
- 车位包销合同协议模板
- 《FPC材料介绍》课件
- 员工转岗协议书范本
- 四川省遂宁市射洪县九年级2024-2025学年(上)期末化学试卷(含答案)
- 2025-2030中国器官芯片行业市场发展趋势与前景展望战略研究报告
- 医院医疗保险费用审核制度
- 村卫生室医疗质量相关管理制度
- 中小学校园中匹克球推广策略与实践研究
- 2024年世界职业院校技能大赛高职组“体育活动设计与实施组”赛项考试题库(含答案)
评论
0/150
提交评论