版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.1多进程并发TCP服务器与客户端进程结构4.1.1多进程并发TCP服务器进程结构图4.1给出了多进程并发TCP服务器的进程结构,在该服务器中使用的是单线程的进程,即一个进程之中只包含一个线程。4.1.2多进程并发客户端进程结构UNIX/Linux系统支持一个进程中有多个线程共享内存,图4.2给出了在UNIX/Linux环境下如何使用多线程/多进程的并发客户方法来支持面向连接的应用协议。返回4.2UNIX/Linux环境下多进程并发TCP
服务器软件设计流程4.2.1不固定进程数的并发TCP服务器软件设计流程步骤1:主进程创建主套接字msock并绑定到熟知端口。步骤2:主进程调用accept()函数基于主套接字在熟知端口上等待客户连接请求的到达。步骤3:当有客户连接请求到达时,主进程建立与该客户之间的通信连接,同时accept()调用返回一个新的用于该连接的从套接字描述符ssock。步骤4:主进程创建一个新的从进程来处理该连接。步骤5:主进程关闭套接字ssock(此时,由于从进程仍然打开着从套接字ssock,故主进程的关闭操作仅仅只是把从套接字ssock的引用计数减少1,而不会真正关闭该从套接字)。下一页返回4.2UNIX/Linux环境下多进程并发TCP
服务器软件设计流程步骤6:主进程返回步骤2继续执行。步骤7:从进程关闭主套接字msock(此时,由于主进程仍打开着主套接字msock,故从进程的关闭操作仅仅是把主套接字msock的引用计数减少1,而不会真正关闭该主套接字)。步骤8:从进程调用recv()和send()等操作与客户进行数据交换。步骤9:数据交换完毕,从进程关闭从套接字ssock,从进程结束。4.2.2固定进程数的并发TCP服务器软件设计流程固定进程数的并发TCP服务器模型是一种介于单进程与多进程之间的折中方案,在固定进程数的并发TCP服务器模型中,主进程在创建主套接字msock之后将创建给定数目的从进程,由从进程来等待客户端的连接请求并完成与客户端的通信交换等工作,而主进程的功能只是用于维持从进程的数量不变。上一页下一页返回4.2UNIX/Linux环境下多进程并发TCP
服务器软件设计流程1.父进程的设计流程步骤1:主进程创建主套接字msock并绑定到熟知端口。步骤2:主进程创建给定数目的从进程。步骤3:主进程调用wait()函数等待从进程结束,一旦有从进程退出,则主进程立即创建一个新的从进程,以保证从进程在数量上维持不变。2.从进程的设计流程步骤1:从进程调用accept()函数等待客户连接请求的到达。步骤2:当有客户连接请求到达,从进程建立与该客户之间的通信连接,同时accept()调用返回一个新的用于该连接的从套接字描述符ssock。步骤3:从进程调用recv()和send()等操作与客户端进行数据交换。步骤4:数据交换完毕,从进程关闭从套接字ssock。步骤5:从进程返回步骤1继续执行。上一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程4.3.1不固定进程数的多进程并发TCP服务器通信实现例程1.服务器端例程(不固定进程数)该服务器所实现的功能为:首先,等候客户连接请求,一旦连接成功则显示客户的IP地址;然后,接收该客户的名字并显示;最后,接收来自用户的其他信息,每收到一个字符串时,则首先显示该字符串,然后再将该字符串反转并将反转后的字符串回送给该客户端。下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程2.客户端例程客户端首先与服务器相连,接着发送客户端名字,然后发送客户信息,接收到服务器信息并显示,之后等待用户输入Ctrl+D,就关闭连接并退出。//TCPclient.c#include<stdio.h>#include<unistd.h>#include<string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程#include<netdb.h>#include<stdlib.h>#defineSERVER_PORT10000//定义服务器的熟知端口号#defineBUFSIZE100//定义缓冲区的大小voidprocess(FILE*fp,intsockfd);/*声明用于处理与服务器之间的通信的子函数process*/if((numbytes=recv(sockfd,recvline,BUFSIZE,0))==0){/*调用recv()函数接收服务器的应答信息并存入缓冲区recvline*/printf("Serverterminated.\n");return;}上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程recvline[numbytes]='\0';//在字符串末尾添加字符串结束符'\0'printf("ServerMessage:%s\n",recvline);//打印输出服务器的回送信息内容}printf("\nExit.\n");}char*getMessage(char*sendline,intlen,FILE*fp){printf("Inputstringtoserver:");return(fgets(sendline,BUFSIZE,fp));/*调用fgets()函数接受客户从键盘输入的信息并存入缓冲区sendline*/}上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程4.3.2固定进程数的多进程并发TCP服务器通信实现例程1.服务器端例程(固定进程数)该服务器例程所实现的功能为将服务器系统时间返回给客户端。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/in.h>上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程#include<sys/types.h>#include<unistd.h>#include<time.h>#include<signal.h>#defineBUFLEN1024#definePIDNUM3staticvoidhandle_fork(intmsock){intssock;structsockaddr_inclentaddr;charbuf[BUFLEN];socklen_tlen;time_tnow;上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程if(msock<0){//调用socket()函数出错printf("CreateSocketFailed!\n");exit(-1);}printf("CreateSocketSuccessfully!\n");/*以下语句用于给端点地址结构体变量servaddr赋值*/memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;//给协议族字段赋值/*以下语句用于给结构体变量servaddr的IP地址字段赋值*/if(argv[1])servaddr.sin_addr.s_addr=inet_addr(argv[1]);上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程elseservaddr.sin_addr.s_addr=INADDR_ANY;if(argv[2])port=atoi(argv[2]);elseprintf("ServerisListening……!\n");signal(SIGCLD,SIG_IGN);inti=0;for(i=0;i<PIDNUM;i++){//主进程只负责创建PIDNUM个从进程pid[i]=fork();if(pid[i]==0)上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程handle_fork(msock);//在从进程中调用子函数与客户端通信}close(msock);//关闭主套接字return0;}2.客户端例程客户端例程所实现的功能为:首先向服务器发送TIME消息,然后读取服务器返回的系统时间并将其打印出来。#include<stdio.h>#include<stdlib.h>上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<unistd.h>#include<time.h>#defineBUFLEN1024上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程}printf("conncetsuccess!\n");memset(buf,'\0',sizeof(buf));strcpy(buf,"TIME");send(tsock,buf,strlen(buf),0);memset(buf,'\0',sizeof(buf));len=recv(tsock,buf,BUFLEN,0);if(len>0)printf("服务器的系统时间是:%s\n",buf);close(tsock);//关闭套接字return0;}上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程4.3.3UNIX/Linux服务器与Windows客户端通信实现例程1.服务器端例程(UNIX/Linux)#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程#include<sys/wait.h>#defineSERVER_PORT10000//定义端口号为10000#defineQUEUE10//定义等待队列长度为10}/*以下语句用于设置等待队列长度和设套接字为被动模式*/ret=listen(msock,QUEUE);if(ret<0){//调用listen()函数出错printf("ListenFailed!\n");exit(-1);}while(1){上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程ssize=sizeof(structsockaddr_in);memset(&clientaddr,0,sizeof(clientaddr));if((ssock=accept(msock,(structsockaddr*)&clientaddr,&ssize))==-1){printf("AcceptFailed!\n");continue;}printf("gotconnectionfrom%s\n",inet_ntoa(their_addr.sin_addr));if(!fork()){//在从进程中close(msock);//关闭主套接字上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程if(send(ssock,buf,strlen(buf),0)==-1)printf("SendDataError.\n");close(ssock);exit(0);}close(ssock);//在主进程中关闭从套接字while(waitpid(-1,NULL,WNOHANG)>0);/*waitpid()的返回值有3情况:①正常情况下返回收集到的子进程ID;②若设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集则返回0;③若调用中出错则返回-1*/}}上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程2.客户端例程(Windows)#include"stdafx.h"#include<Winsock2.h>#include<Winsock.h>#include<windows.h>#include<stdio.h>#pragmacomment(lib,"WS2_32.lib")#include<stdlib.h>intmain(intargc,_TCHAR*argv[]){inti;charrecvBuffer[255];上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程interr;intret;WORDsockVersion=MAKEWORD(2,2);WSADATAwsaData;ret=WSAStartup(sockVersion,&wsaData);if(ret!=0){printf("Couldn'tFindaUseableWinsock.dll!\n");exit(-1);}SOCKETtsock;//声明套接字描述符变量tsock=socket(AF_INET,SOCK_STREAM,0);//创建套接字上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程if(tsock==INVALID_SOCKET){//调用socket()函数出错printf("CreateSocketFailed!\n");exit(-1);}structsockaddr_inservaddr;ZeroMemory(&servaddr,sizeof(servaddr));/*以下3条语句用于给端点地址结构体变量servaddr赋值*/servaddr.sin_addr.s_addr=inet_addr("192.11.11.11");servaddr.sin_family=AF_INET;servaddr.sin_port=htons(10000);printf("Connectingtoserver...\n");上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程/*以下语句用于向远程服务器发起TCP连接建立请求*/intret;ret=connect(tsock,(structsockaddr*)&servaddr,sizeof(structsockaddr));if(ret<0){//调用connect()函数出错printf("ConnectFailed!\n");exit(-1);}recv(tsock,recvBuffer,sizeof(recvBuffer),0);printf("%s\n",recvBuffer);closesocket(tsock);WSACleanup();上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程return0;}4.3.4基于SMTP和POP3协议的电子邮件收发实现例程1.电子邮件收发原理电子邮件的收发流程如图4.3所示,其中,邮件接收采用的是POP3(PostOfficeProtocol3,邮局协议版本3)协议,该协议是在RFC-1939中定义的,是Internet上的大多数人用来接收邮件的机制。POP3协议采用Client/Server工作模式,默认使用TCP110端口。而邮件发送则采用的是SMTP(SimpleMessageTransferrotocol,简单邮件传输)协议,该协议是在RFC-821中定义的,是Internet上的大多数人用来发送邮件的机制。SMTP协议采用Client/Server工作模式,默认使用TCP25端口。上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程POP3服务器的响应一般形式为:“+OK”表示成功,“-ERR”表示失败。POP3协议的常用指令主要包括:①USER<用户名>:用户登录。②PASS<密码>:发送用户密码。③STAT:返回邮箱列表(邮件数量、字节)。④DELE<邮件编号>:删除指定的邮件。⑤LIST<邮件编号>:返回指定的邮件报头。⑥RETR<邮件编号>:传回指定的邮件,以只有一个“.”号的行结束。⑦QUIT:关闭连接。上一页下一页返回4.3UNIX/Linux环境下多进程并发TCP
服务器通信实现例程基于POP3协议接收电子邮件的具体实现步骤为:步骤1:客户端使用TCP协议连接邮件服务器的110端口。步骤2:客户端使用USER命令将邮箱的账号传给POP3服务器。步骤3:客户端使用PASS命令将邮箱的账号传给POP3服务器。步骤4:完成用户认证后客户端使用STAT命令请求服务器返回邮箱的统计资料。步骤5:客户端使用LIST命令列出服务器里的邮件数量。步骤6:客户端使用RETR命令接收邮件,接收一封后便使用DELE命令将邮件服务
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位食堂集中采购制度
- 山西运城农业职业技术学院《中国对外贸易》2025-2026学年期末试卷
- 山西铁道职业技术学院《病毒学》2025-2026学年期末试卷
- 上海东海职业技术学院《风电机组设计与制造》2025-2026学年期末试卷
- 上海旅游高等专科学校《国际商务》2025-2026学年期末试卷
- 上海科创职业技术学院《工程结构抗震》2025-2026学年期末试卷
- 上海健康医学院《电工学简明教程》2025-2026学年期末试卷
- 太原师范学院《文学理论》2025-2026学年期末试卷
- Breceptin-B-9870-生命科学试剂-MCE
- 石英玻璃冷加工工操作水平竞赛考核试卷含答案
- 读书分享-非暴力沟通课件
- 机动车驾驶员培训结业证书(样式)
- 广东药科大学实验报告纸
- 中国政治思想史马工程课件第二章 春秋时期的政治思想
- SB/T 10736-2012酒吧经营服务规范
- LY/T 2083-2013全国营造林综合核查技术规程
- GB/T 18663.1-2002电子设备机械结构、公制系列和英制系列的试验第1部分:机柜、机架、插箱和机箱的气候、机械试验及安全要求
- GB/T 14488.1-2008植物油料含油量测定
- GA/T 1567-2019城市道路交通隔离栏设置指南
- 人力资源六大模块知识课件
- 城市商圈及商业体量、人流量计算模型课件
评论
0/150
提交评论