




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10/19TCP/IP通信程序设计1、试验目的TCP/IP通信程序的设计。2、试验环境1、Windows2022/NT/XP操作系统。2、TCP/IP协议。3、编程工具:MicrosoftVisualC++2022 。3、相关学问TCP/IP协议族1TCP/IP协议族应用层〔FTP,DNS,,TELNET,SMTP应用层〔FTP,DNS,,TELNET,SMTP等〕TCPUDPICMPIGMPIPARPRARP网络接口层IP分组的转发。2、牢靠数据传递。TCP使用挨次号、承受直接应答方式,并在必要时通过重传来保证发自源端的数据能成功地被传递到目的地。3、流量掌握。接收方向发送方发送一个接收窗口值,告知发送方接收方能够处理多少数据。在收到接收方发来的应答前,TCP发送方最多只能发送等于该窗口值的数据量。TCP发送方发送的信息量超过网络中链路或路由器的最大处理力量。TCP主机能快速而公正地调整其发送速率,以到达与网络及接收方的处理力量相匹配。IP。假设没有端口,传输层就无法知道数据应当交付给应用层的哪个进程。因此,端口标示了应用层的进程。UDP216个不同的端口值。端口分为两类:、周知端口t3N负责安排〔PP6的端口作为保存端口。2、临时端口,也称本地安排。进程需要访问传输效劳时,向本地操作系统提己和相应的端口号联系起来。Socket的英文原义t与交换机的插座格外类似,进程通信前,双方各创立一个Socket号,由操作系统安排。SocketIPIP1所示。IP地址
端口号80808080Socket1SocketIP地址、端口号2所示。端口端口8080连1686端口8084连接23端口8080接连端口808062与同一台主机建立三个连接TCP/IPTCP/IP标准中的功能,可以接口、Windows的TLI接口等。Socket的操作方式BSDUNIXBSDUNIXSocket的工作流程如图4所示。St,它只是简洁地投出数据报。无连接的操作简洁高效,但数据的安全性不佳。socketbindsocketbindlisten客户机acceptsocket堵塞,等待客户连接恳求 建立连接connect恳求数据readwrite处理恳求write应答数据readcloseclose3C/S时序图socketbindsocketbind客户机listensocket堵塞,等待客户连接恳求建立连接connect恳求数据readwrite处理恳求write应答数据readcloseclose4C/S时序图4、TCP通信程序设计编程要点Listen方法ConnectionRequest大事方法承受恳求,从而与客户端建立连接。接,则通信过程终止。客户端程序客户端程序遵循以下步骤:读和写的流。3〕操作流。4〕关闭流。客户端的源程序代码如下://ModuleName:Client.c////Description:// Thissampleistheechoclient.ItconnectstotheTCPserver,// sendsdata,andreadsdatabackfromtheserver.////Compile:// cl-oClientClient.cws2_32.lib////CommandLineOptions:// client[-p:x][-s:IP][-n:x][-o]// -p:x Remoteporttosendto// -s:IP Server”sIPaddressorhostname// -n:x Numberoftimestosendmessage// -o Sendmessagesonly;don”treceive//#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#pragmacomment(lib,“ws2_32“)#defineDEFAULT_COUNT 20#defineDEFAULT_PORT 5150#defineDEFAULT_BUFFER 2048#defineDEFAULT_MESSAGE “Thisisatestoftheemergency\broadcastingsystem“char szServer[128], //ServertoconnecttoszMessage[1024]; //Messagetosendtoseverint iPort =DEFAULT_PORT; //PortonservertoconnecttoDWORDdwCount =DEFAULT_COUNT;//NumberoftimestosendmessageBOOL bSendOnly=FALSE; //Senddataonly;don”treceive////Function:usage:////Description:// Printusageinformationandexit//voidusage{printf(“usage:client[-p:x][-s:IP][-n:x][-o]\n\n“);printf(“ -p:x Remoteporttosendto\n“);printf(“ -s:IP Server”sIPaddressorhostname\n“);printf(“ -n:x Numberoftimestosendmessage\n“);printf(“ -o Sendmessagesonly;don”treceive\n“);ExitProcess(1);}////Function:ValidateArgs////Description:// Parsethecommandlinearguments,andsetsomeglobalflags// toindicatewhatactionstoperform//voidValidateArgs(intargc,char**argv){int i;for(i=1;i<argc;i++){if((argv[i][0]==”-”)||(argv[i][0]==”/”)){switch(tolower(argv[i][1])){case”p”: //Remoteportif(strlen(argv[i])>3)iPort=atoi(&argv[i][3]);break;case”s”: //Serverif(strlen(argv[i])>3)strcpy(szServer,&argv[i][3]);break;case”n”: //Numberoftimestosendmessageif(strlen(argv[i])>3)dwCount=atol(&argv[i][3]);break;case”o”: //Onlysendmessage;don”treceivebSendOnly=TRUE;break;default:usage;break;}}}}////Function:main////Description:// Mainthreadofexecution.InitializeWinsock,parsethe// commandlinearguments,createasocket,connecttothe// server,andthensendandreceivedata.//intmain(intargc,char**argv){WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret,i;structsockaddr_inserver;structhostent *host=NULL;//ParsethecommandlineandloadWinsock//ValidateArgs(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf(“FailedtoloadWinsocklibrary!\n“);return1;}strcpy(szMessage,DEFAULT_MESSAGE);////Createthesocket,andattempttoconnecttotheserver//sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient==INVALID_SOCKET){printf(“socketfailed:%d\n“,WSAGetLastError);return1;}server.sin_family=AF_INET;server.sin_port=htons(iPort);server.sin_addr.s_addr=inet_addr(szServer);////Ifthesuppliedserveraddresswasn”tintheform//“aaa.bbb.ccc.ddd“it”sahostname,sotrytoresolveit//if(server.sin_addr.s_addr==INADDR_NONE){host=gethostbyname(szServer);if(host==NULL){printf(“Unabletoresolveserver:%s\n“,szServer);return1;}CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);}if(connect(sClient,(structsockaddr*)&server,sizeof(server))==SOCKET_ERROR){printf(“connectfailed:%d\n“,WSAGetLastError);return1;}//Sendandreceivedata//for(i=0;i<dwCount;i++){ret=send(sClient,szMessage,strlen(szMessage),0);if(ret==0)break;elseif(ret==SOCKET_ERROR){printf(“sendfailed:%d\n“,WSAGetLastError);break;}printf(“Send%dbytes\n“,ret);if(!bSendOnly){ret=recv(sClient,szBuffer,DEFAULT_BUFFER,0);if(ret==0) //Gracefulclosebreak;elseif(ret==SOCKET_ERROR){printf(“recvfailed:%d\n“,WSAGetLastError);break;}szBuffer[ret]=”\0”;printf(“RECV[%dbytes]:”%s”\n“,ret,szBuffer);}}closesocket(sClient);WSACleanup;return0;}库WSAStartup(MAKEWORD(2,2),&wsd);2、创立套接字socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);该调用要接收三个参数:af、type、protocolaf指定通信发生的区域,、AF_INET、AF_NSDOS、WINDOWSAF_INETtype描protocol说明该套接字使用的特定协议,假设调用0,使用默认的连接模式。依据这三个参数建立一个套接字,并将相应的资源安排给它,同时返回一个整型套接字号。因此,socket系统调用实际上指定了相关五元组中的“协议”这一元。3、建立套接字连接进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且假设收到的一个数据报,其目的端口未connect的调用格式如下:connect(SOCKETs,conststructsockaddrFAR*name,intnamelen);name指出说明对方套接字地namelen说明。的协议中,该调用导致本地系统和外部系统之间连接实际建立。socket调用bindconnect无须协议作为参数。recvsendrecv。s指定的已连接的数据报或流套接字上发送输出数据,格式如下:send(SOCKETs,constcharFAR*buf,intlen,intflags);buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输掌握方式,如是否发送带外数据等。假设没有SOCKET_ERROR。recvs指定的已连接的数据报或流套接字上接收输入数据,格式如下:recv(SOCKETs,charFAR*buf,intlen,intflags);。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输掌握方式,如是否接收带外数据等。假设没有错误发生,recv返回总共接收的字节数。假设连接被关闭,返回 0。否则它返回SOCKET_ERROR。5-closesocketclosesocket的调用格式如下:closesocket(SOCKETs);sSOCKET_ERROR。效劳器端程序效劳器端程序遵循以下根本步骤:使用取得的连接。3〕建立输入和输出流。。。处理一个。所以看起来它在同时处理多个恳求。效劳器端的源程序代码如下://ModuleName:Server.c////Description:// ThisexampleillustratesasimpleTCPserverthataccepts// incomingclientconnections.Onceaclientconnectionis// established,athreadisspawnedtoreaddatafromthe// clientandechoitback(iftheechooptionisnot// disabled).////Compile:// cl-oServerServer.cws2_32.lib////Commandlineoptions:// server[-p:x][-i:IP][-o]// -p:x Portnumbertolistenon// -i:str Interfacetolistenon// -o Receiveonly,don”techothedataback//#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#pragmacomment(lib,“ws2_32“)#defineDEFAULT_PORT5150#defineDEFAULT_BUFFER4096int iPort =DEFAULT_PORT;//PorttolistenforclientsonBOOL bInterface=FALSE, //ListenonthespecifiedinterfacebRecvOnly =FALSE; //Receivedataonly;don”techobackchar szAddress[128]; //Interfacetolistenforclientson////Function:usage////Description:// Printusageinformationandexit//voidusage{printf(“usage:server[-p:x][-i:IP][-o]\n\n“);printf(“ -p:x Portnumbertolistenon\n“);printf(“ -i:str Interfacetolistenon\n“);printf(“ -o Don”techothedataback\n\n“);ExitProcess(1);}////Function:ValidateArgs////Description:// Parsethecommandlinearguments,andsetsomeglobalflags// toindicatewhatactionstoperform//voidValidateArgs(intargc,char**argv){inti;for(i=1;i<argc;i++){if((argv[i][0]==”-”)||(argv[i][0]==”/”)){switch(tolower(argv[i][1])){case”p”:iPort=atoi(&argv[i][3]);break;case”i”:bInterface=TRUE;if(strlen(argv[i])>3)strcpy(szAddress,&argv[i][3]);break;case”o”:bRecvOnly=TRUE;break;default:usage;break;}}}}////Function:ClientThread////Description:// Thisfunctioniscalledasathread,andithandlesagiven// clientconnection. Theparameterpassedinisthesocket// handlereturnedfromanacceptcall. Thisfunctionreads// datafromtheclientandwritesitback.//DWORDWINAPIClientThread(LPVOIDlpParam){SOCKET sock=(SOCKET)lpParam;char szBuff[DEFAULT_BUFFER];int ret,nLeft,idx;while(1){//Performablockingrecvcall//ret=recv(sock,szBuff,DEFAULT_BUFFER,0);if(ret==0) //Gracefulclosebreak;elseif(ret==SOCKET_ERROR){printf(“recvfailed:%d\n“,WSAGetLastError);break;}szBuff[ret]=”\0”;printf(“RECV:”%s”\n“,szBuff);////Ifweselectedtoechothedataback,doit//if(!bRecvOnly){nLeft=ret;idx=0;////Makesurewewriteallthedata//while(nLeft>0){ret=send(sock,&szBuff[idx],nLeft,0);if(ret==0)break;elseif(ret==SOCKET_ERROR){printf(“sendfailed:%d\n“,WSAGetLastError);break;}nLeft-=ret;idx+=ret;}}}return0;}////Function:main////Description:// Mainthreadofexecution.InitializeWinsock,parsethe// commandlinearguments,createthelisteningsocket,bind// tothelocaladdress,andwaitforclientconnections.//intmain(intargc,char**argv){WSADATA wsd;SOCKET sListen,sClient;int iAddrSize;HANDLE hThread;DWORD dwThreadId;structsockaddr_inlocal,client;ValidateArgs(argc,argv);if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){printf(“FailedtoloadWinsock!\n“);return1;}//Createourlisteningsocket//sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);if(sListen==SOCKET_ERROR){printf(“socketfailed:%d\n“,WSAGetLastError);return1;}//Selectthelocalinterfaceandbindtoit//if(bInterface){}else
local.sin_addr.s_addr=inet_addr(szAddress);if(local.sin_addr.s_addr==INADDR_NONE)usage;local.sin_addr.s_addr=htonl(INADDR_ANY);local.sin_family=AF_INET;local.sin_port=htons(iPort);if(bind(sListen,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR){printf(“bindfailed:%d\n“,WSAGetLastError);return1;}listen(sListen,8);////Inacontinousloop,waitforincomingclients.Onceone//isdetected,createathreadandpassthehandleofftoit.//while(1){iAddrSize=sizeof(client);sClient=accept(sListen,(structsockaddr*)&client,&iAddrSize);if(sClient==INVALID_SOCKET){printf(“acceptfailed:%d\n“,WSAGetLastError);break;}printf(“Acceptedclient:%s:%d\n“,inet_ntoa(client.sin_addr),ntohs(client.sin_port));hThread=CreateThread(NULL,0,ClientThread,(LPVOID)sClient,0,&dwThreadId);if(hThread==NULL){printf(“CreateThreadfailed:%d\n“,GetLastError);break;}CloseHandle(hThread);}closesocket(sListen);WSACleanup;return0;}与客户端程序相比,效劳器端在以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业内部控制标准手册
- 合同能源托管合同协议书
- 2025年国网河南省电力公司招聘高校毕业生950人(第一批)笔试参考题库附带答案详解
- 2024年汽车保险项目投资申请报告代可行性研究报告
- 2025年上半年宜昌宜都文化局招考易考易错模拟试题(共500题)试卷后附参考答案
- 2024年数控石油深井测井仪项目资金筹措计划书代可行性研究报告
- 2025中国储备粮管理集团有限公司江苏分公司招聘73人笔试参考题库附带答案详解
- 2025年上半年安徽省淮南市市直机关事业单位遴选46人易考易错模拟试题(共500题)试卷后附参考答案
- 汽车车载网络控制技术 汽车车载网络技术认知教案
- 2025年上半年安徽滁州来六高速公路开发限公司招聘易考易错模拟试题(共500题)试卷后附参考答案
- 医院诊断证明书word模板
- GB/T 19266-2008地理标志产品五常大米
- 市政级安全管理
- 锂离子电池粘结剂总结ATLCATL课件
- 语言学纲要全套课件
- 三甲医院等级评审中与检验科有关的制度文件
- 全国2020年04月自学考试00040法学概论试题答案
- JJF(苏)243-2021分布光度计校准规范-(现行有效)
- 螺旋箍筋长度计算公式excel(自动版)
- 珍珠的质量分级及评估
- 3-001-铁路货物运价规则
评论
0/150
提交评论