收藏 分享(赏)

09 第十三次课 Socket网络编程.ppt

上传人:saw518 文档编号:9995700 上传时间:2019-09-26 格式:PPT 页数:84 大小:588.50KB
下载 相关 举报
09 第十三次课 Socket网络编程.ppt_第1页
第1页 / 共84页
09 第十三次课 Socket网络编程.ppt_第2页
第2页 / 共84页
09 第十三次课 Socket网络编程.ppt_第3页
第3页 / 共84页
09 第十三次课 Socket网络编程.ppt_第4页
第4页 / 共84页
09 第十三次课 Socket网络编程.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、第三部分 UNIX网络编程,第一章 Socket 接口与网络编程 第二章 客户 / 服务器程序设计,第一章 socket 接口与网络编程,、TCP/IP概述(复习) 一、网络环境中分布式进程通信的基本概念 二、套接字socket 三、socket 系统调用 四、client / server计算模型 五、UNIX域协议(了解) 六、并发服务器与超级服务器,TCP/ IP 概述,TCP/IP与Internet历史 OSI与TCP/IP TCP/IP协议栈与数据包 IP地址与端口号,TCP/IP与Internet历史,DOD: Advanced Research Project Agency -

2、ARPA发起要求 : 站点间连接可靠;容易增删节点;连接不同类型的计算机;结果 : 产生了许多新的概念和方法:异种机互联,资源共享,分组交换,分布控制,通信处理机,协议分层 1969年, 建立 ARPANET 1972年, 发布 ARPANET开始NCP(Netware Contral Protocol)设计编辑RFC(Request For Comment)( 60-70年代通信线路变化: 租用线 无线网 - 卫星网 - 网络互联) 1975年, ARPANET从试验到运营开始TCP/IP开发(Trasmission Control Protocol/Internet Protocol) 1

3、981年, TCP/IP加入 4.1BSD UNIX内核TCP/IP取代NCP以ARPA为主建立Internet,1983年, ARPA向TCP/IP的转换结束;TCP/IP成为军用标准;MILNET从ARPANET中分离出来(后者用于研究);ARPA低价出售TCP/IP; 1985年, NSF(National Sicence Foundation)围绕6台超级计算机建立TCP/IP 网; 1986年, NSFNET 建成,取代ARPA成为主干网; 1988年, NSFNET对一般的研究者开放; 1990年, ARPANET停止运行; Internet定义(A.S.Tanenbanm )一台

4、计算机若有TCP/IP协议栈,有IP地址,有能力向其它机器发送IP包,则称它在Internet上。 Internet与传统应用EmailNewsRemote loginFile transfer 90年代以后,WWW出现迅速把Internet用户从学术机构,政府,工业界推广到普通用户.,OSI 与 TCP/IP,OSI: Open Systems Interconnection,Application Presentation Session Transport Network Data link Physical,ApplicationTransport Network Host-to Ne

5、twork,OSI,TCP/IP,7 6 5 4 3 2 1,先有模型后有协议网络层:连接/非连接传输层:连接,先有协议后有模型 (不适用于其它网络)网络层:只有非连接传输层:连接/非连接,TCP/IP协议栈与数据包,rlogin,data,tcp port data,ipaddr tcp port data,ether header ip header tcp header data tail,报文message,分组package,数据报datagram,帧frame,14,20,20,4,bytes,ether header: 48位 source addr48位 dest . addr

6、IP header: 32位 source addr32位 dest. addr TCP header: 16位 source port no.16位 dest. port no.,cable,ethernet,IP,TCP,rlogin,cable,ethernet,IP,TCP,IP地址与端口号,0 netaddr hostaddr,10 netaddr hostaddr,110 netaddr hostaddr,1110 Multicastaddr(多播组ID),11110 reserved,A类,B类,C类,D类,E类,1.0.0.0 127.255.255.255,128.0.0.0

7、 191.255.255.255,192.0.0.0 223.255.255.255,224.0.0.0 239.255.255.255,240.0.0.0 247.255.255.255,Ipaddr = INADDR_ANY(全0) 表示多宿地址(multihomed)端口号(port)分配(BSD,16位)1 - 255 保留256 - 511 4.3 BSD保留512 - 1023 rresvport()分配(client用)1024 - 50000 自动分配 (port=0时 bind在此范围指定port值) 50001 - 65535 BSD server,一、网络环境中分布式进程

8、通信的基本概念,网络层及以下的各层实现了网络中主机之间的通信,但是主机间数据通信不是最终的目的; 网络最本质的活动是分布在不同地理位置的主机之间的进程通信,以实现各种网络服务功能;设置传输层的主要目的就是要实现分布式进程通信。,单机环境下的进程通信,文件锁、管道(pipe)、命名管道(named pipe)和软中断信号(signal)机制; 消息队列(message queue)、信号量( semaphore )和 共享存储区( shared memory ),统称为进程通信(inter process communication IPC)机制; IPC机制也不适应于网络环境中的进程通信。,网

9、络环境中的进程通信与单机系统内部的进程通信的主要区别:网络中主机的高度自治性;不是在同一个主机系统之中,没有一个统一的高层进行控制与管理; 网络中一台主机对其它主机的如下情况一概无从知道 活动状态 位于其它主机系统中的各个进程状态 这些进程什么时间参与网络活动 希望与网络中哪一台主机的什么进程通信,网络环境中分布式进程通信 需要解决:,进程命名与寻址方法多重协议的识别进程间相互作用的模式,(1)网络环境中进程标识,在一台计算机中,不同的进程用进程号或进程标识(process ID)唯一地标识出来 网络环境中完整的进程标识应该是: 本地主机地址-本地进程标识 远程主机地址-远程进程标识 不同主机

10、上的进程标识,需要主机地址(如IP地址)和端口号的参与。,(2)多重协议的识别,Unix网络编程接口支持的通信协议包括: TCP/IP协议族的TCP和UDP 施乐网络系统(Xerox NS)的顺序分组协议(Sequential Packet Protocol, SPP, 类似于TCP) 互联网数据报协议(Internetworking Datagram Protocol, IDP, 类似于UDP) ARPANET的接口报文处理机链路协议(IMPLINK) Unix系统的内部进程协议一个特定的网络间进程通信只能使用相同的网络通信协议,网络环境中一个进程的全网唯一的标识需要一个三元组(half-a

11、ssociation)来表示:( 协议,本地地址,本地端口号). 网络环境中一个完整的进程通信标识需要一个五元组(association)来表示:(协议,本地主机地址,本地端口号,远端主机地址,远端端口号),(3)进程间相互作用模式:Client/Server模型,在TCP/IP协议体系中,进程间的相互作用采用客户/服务器(Client/Server)模型 ; 客户与服务器分别表示相互通信的两个应用程序的进程; 客户向服务器发出服务请求,服务器响应客户的请求,提供客户机所需要的网络服务;,网络应用程序采用客户/服务器 模式的原因,网络环境中资源、计算能力和信息分布的不均匀性。 网络环境中进程通

12、信的异步性。必须要建立一个体制,为准备通信的进程之间建立起连接,在进程交换数据的过程中维护连接,为数据交换提供同步。(不存在一个高层的调度与协调),在客户/服务器模式中,每次通信均由随机启动的客户进程发起,而服务器进程从开机起就处于等待状态,这样可以保证服务器随时对客户请求做出响应 。,二. 套接字(socket),套接字接口与套接字套接字地址结构INET与UNIX协议族地址结构套接字对 (socket pair),Socket 概念,套接字接口是应用层与TCP/IP协议族通信的中间软件抽象层。它是一组网络编程接口,包括一系列系统和库调用,头文件和数据结构。 套接字接口的主要对象是套接字,可以

13、把它看作本地应用进程与网络的接入点。,套接字地址结构,Socket API中提供了三种类型的地址: sockaddr是通用的套接字结构; sockaddr_in为Internet 协议族的地址描述结构; sockaddr_un则是Unix协议族的地址描述结构;struct sockaddru_short sa_family; /* 地址族 */ char sa_data14; /* 与协议有关的地址 */; Sa_family 可以取值: AF_INET / internet 协议 Ipv4 AF_UNIX / unix internal协议, posix.1g定义为AF_LOCAL AF_I

14、NET6 / internet 协议 Ipv6 AF_NS / Xerox NS协议 AF_IPX / Novell 网络协议,INET与UNIX协议族地址结构,AF_INET协议族地址结构 struct sokcaddr_in short sin_family; /* AF_INET */u_short sin_portstruct in_addr sin_addr;char sin_zero8; struct in_addr u_long s_addr; /* 32位netid / hostid地址 */; AF_UNIX协议族地址结构: struct sockaddr_unshort s

15、in_famity; /* AF_UNIX */char sin_path108; /* 文件名,不代表真正文件 */ ;,unsigned long inet_addr(char *address); address是以NULL结尾的点分IPv4字符串。该函数返回32位的地址。例: in_addr addr; addr.s_addr = inet_addr(“ 202.118.75.93 “); char* inet_ntoa(struct in_addr address); address是IPv4地址结构,函数返回一指向包含点分IP地址的静态存储区字符指针,如果错误则函数返回NULL。,

16、地址转换函数 (inet_addr() 和 inet_ntoa(),套接字对(socket pair),套接字: 标志每个端点的两个值(ip地址和port 号)通常称为一个套接字(socket). 套接字对是一个四元组: 本地IP地址, 本地端口号, 远地IP地址, 远地端口号。 一个套接字对唯一标识一个TCP连接,但此概念也可扩展到UDP。 套接字对表示: 本地IP地址.本地端口,远地IP地址.远地端口 例如: 198.69.10.2, 1500 , 202.62.226.35, 21 ,三. socket系统调用,socket bind listen accept connect clos

17、e 读写函数,socket系统调用简介,套接字接口的主要对象是套接字,可以把它看作本地应用进程与网络的接入点,接口定义了各种操作:(1)创建套接字(2)将套接字连到网上(3)通过套接字发送/接收消息(4)关闭套接字,socket,int socket( int family , int type , int protocol); 建立套接字,指定通信类型,返回套接字描述字family:协议族 AF_INET(IPV4) AF_INET6(IPV6) AF_UNIX (AF LOCAL)type:套接字类型SOCK_STREAM : 字节流(使用TCP 实现)SOCK_DGRAM : 数据报(使

18、用UDP 实现)SOCK_RAW : 原始(裸层 socket, 允许特权进程直接访问低层通信协议)protocol: 协议名,常缺省为0;,bind,int bind( int sockfd, const struct sockaddr *myaddr, socket_t addrlen ); 给socket分配本地协议地址(ipaddr和port).sockfd: 表示已获得的套接字号 ipaddr = 0 (INADDR_ANY): 在连接(TCP)或发送数据报(UCP)时核心指定. port = 0: 核心指定临时端口号. 非连接协议也可以使用bind, 但较少使用。 INADDR_A

19、NY 通配符地址告诉系统假如有多个接口,本服务器进程将接受任意一个Internet 接口的连接。具体含义是绑定到0.0.0.0。此时,对所有的地址都将是有效的,如果系统采用多个网卡,那么将在所有网卡上进行绑定,你可以收到发送到所有有效地址上数据包。,listen,int listen(int sockfd, int backlog); 表明服务器进程愿意接收客户进程的连接请求,为套接字建立一个连接请求侦听队列。 backlog:定义在指定的套接字上可以有多少个待处理的连接。通常最大为5(1=backlog=5)。指定了正在等待连接的最大队列长度,它的作用在于处理可能同时出现的几个连接请求。 例

20、如,假定backlog参数为2,如果三个客户机同时发出请求,那么头两个会被放在等待处理的队列中,以便服务器程序依次为它们提供服务,而第三个连接的客户则会收到WSAECONNREFUSED错误。 listen()一般在accept()之前调用。,accept,int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 用于服务器进程接收客户进程的连接请求。 sockfd: 用于收听的套接字,即监听套接字; cliaddr: 返回客户端协议地址(可以为Null); addrlen: cliaddr结构的长度; 函数返

21、回值为新生成的用于连接的套接字(四元组形成)。,connect close,int connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 客户建立与服务器的连接。 servaddr 含有服务器的协议地址; 本地(客户)的协议地址由核心指定;int close(int sockfd); 关闭套接字, 发送队列中余留数据, 终止TCP连接。,socket(),bind(),listen(),accept(),close(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用

22、于以后调用中使用。,调用bind将某地址赋予,使得远程应用程序能访问本地应用程序。,调用listen分配数据空间,以便存储多个用户的连接建立请求。,调用accept将本地应用程序阻塞起来,等待接收客户端发来的连接请求。,释放连接:使用close原语单独释放连接。,服务器端(TCP ),socket(),close(),connect(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。,调用connect阻塞应用程序,传输层实体开始建立连接,当连接建立完成时,取消阻塞。,释放连接:使用close原语单独释放连接。,客户端(TCP ),服务器程

23、序实例,SOCKET s,clientSocket; / 监听Socket / 客户Socket sockaddr_in addr, clientAddr; / 服务器的绑定地址 / 客户地址 in_addr clientIn; / 客户IP地址 int nClientAddrLen; / 客户地址结构长度 / 创建流Socket s = socket(AF_INET, SOCK_STREAM, 0); if (s != INVALID_SOCKET) / 填充地址信息addr.sin_family = AF_INET;addr.sin_port = htons(2000);addr.sin_

24、addr.s_addr = htonl(INADDR_ANY);/ 绑定Socketif (bind(s, (sockaddr*)&addr, sizeof(addr) != SOCKET_ERROR) / 监听连接if (listen(s, 3) != SOCKET_ERROR), /* if listen*/ 设置客户地址结构长度nClientAddrLen = sizeof(clientAddr);/ 接受连接clientSocket = accept(s, (sockaddr*)/. ,客户同服务器建立连接示例,SOCKET s; sockaddr_in serverAddr; s =

25、 socket(AF_INET, SOCK_STREAM, 0); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(2000); serverAddr.sin_addr.s_addr = inet_addr(“202.118.75.93“); if(connect(s, (sockaddr*) else /. ,字节序,不同的计算机系统采用不同的字节序存储数据,同样一个两字节的16位整数,在内存中存储的方式就不同: 一种方式是将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这

26、种方式; 另一种是将高字节存储在起始地址,称为“Big-Endian”字节序,由Macintosh、Motorola等所采用;,0x03,0x04,0x04,0x03,内存地址增大方向,Little-Endian,Big-Endian,0x0304,00 01,字节序转换函数,把给定系统所采用的字节序称为主机字节序。为了避免不同类别主机之间在数据交换时由于对于字节序解释的不同而导致的差错,引入了网络字节序,即网络传输所采用的字节序。规定网络字节序使用“Big-Endian”方式。 主机到网络 u_long htonl (u_long hostlong); /for 32bits u_short

27、 htons (u_short short); /for 16bits 网络到主机 u_long ntohl (u_long hostlong); /for 32bits u_short ntohs (u_short short); /for 16bits,inet_pton与inet_ntop,将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。int inet_pton(int family, const char * strptr, void * addrptr); family可以是AF_INET或AF_INET6;strptr是指向点分十进制串的指针;

28、addrptr是指向转换后的网络字节序的二进制值的指针。 将网络字节序二进制值转换成点分十进制串。const char * inet_ntop(int family, const void * addrptr, char * strptr, size_t len); family可以是AF_INET或AF_INET6: addrptr是指向网络字节序的二进制值的指针; strptr是一个指向转换后的点分十进制串的指针; len是目标的大小,以免函数溢出其调用者的缓冲区。,读写函数,标准文件读写函数:write、 read ssize_t write( int fd, void *buff, s

29、ize_t nbytes ); ssize_t read( int fd, void *buff, size_t nbytes ); 面向连接的socket读写函数: int send ( int sd, const void *msg, size_t len, int flags ); int recv ( int sd, void *msg, size_t len, int flags ); msg指向用于发送/接收数据的缓冲区的指针。 len 是缓冲区的字节数。 flags:如果flags为0,则和read,write一样的操作。 MSG_DONTROUTE | 不查找路由表 MSG_O

30、OB | 接受或者发送带外数据 MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 MSG_WAITALL | 等待所有数据,非连接读写函数: int sendto( int sd, const void *msg, size_t len, int flags, struct sockaddr *to, int addrlen ); 允许进程显式指定消息目的。当调用成功,返回被成功发送的字节数。如客户端未曾执行bind,则sendto分配本地IP地址和临时port号; to指向server协议地址。int recvfrom( int sd, void *msg, size_t len,

31、int flags, struct sockaddr *from, socklen_t *addrlen); 允许应用程序接收通信对等层的地址。当调用成功,返回被接收的字节数。,TCP Sockets 编程基本流程,socket(),bind(),listen(),accept(),send(),recv(),close(),send(),socket(),recv(),close(),connect(),recv(),建立连接,数据请求,数据响应,断连指示,Client,Server,Server,socket(),bind(),recvfrom(),Blocks until data re

32、ceived,Process request,sendto(),Client,socket(),(bind(),sendto(),Blocks until data received,Process reply,recvfrom(),close(),close(),无连接协议的Socket 编程基本流程,四. client / server计算模型,面向连接与 socket 函数 非连接与socket函数,面向连接与 socket 函数,TCP server socket() bind() listen() accept() (等待client 连接) read() 处理请求 write()

33、read() close(),TCP client socket() connect() write()read() close(),建立连接,request,reply,end of file,socket 函数与四元组的建立,非连接与socket函数,UDP Client socket() ( bind() ) sendto()recvfrom(),UDP Server socket() bind() recvfrom() 处理请求 sendto(),socket 函数与四元组的建立,request,repley,五. UNIX域协议(了解),流管道和命名流管道 传递文件描述字(略),流管

34、道,socket,无名流管道: 同一家族进程间通过socket自动同步,file,file,sd1,sd0,fork复制,send,send,recv,recv,缓冲区,打开文件表,打开文件表,socketpair函数,#include int socketpair(int family, int type, int protocol, int sockfd2); 生成两个互相连接的套接字,在sockfd2返回。 family 必须是 AF_LOCAL, protocol必须是0。 type 可以是 SOCK_STREAM 或 SOCK_DGRAM。例: # include # include

35、 int s_pipe(int fd2) return (socketpair (AF_LOCAL, SOCK_STREAM, 0, fd ); ,有名流管道,例:建立有名流管道,借助于 bind 函数为无名流管道指定一个名字。 int ns_pipe(char *name, int fd2) int len;struct sockaddr_un unix_addr;if (s_pipe(fd) 0) return(-1);unlink (name);bzero ( char *) ,四种管道比较,单向 双向 4.3BSD System V pipe y yes yes named pipe(

36、FIFO) y some yes stream pipe y yes yes Named stream pipe y yes yessocketpair与pipe: socketpair类似于 unix的pipe。(BSD 的pipe 就是用socketpair 实现的。) SOCK_STREAM 的 socketpair 也叫做 stream pipe (流管道), 与 unix的pipe的单双工不同, socketpair 是全双工的(full-duplex), 即每个描述字(sockfd)都可以读写。,传递文件描述字,r/w,i_node ,进程1,进程2,fd1,fd2,进程1 把文件

37、的访问权(由fd1引用)传给进程2; 进程2 直接用fd2引用该文件,不再检查inode中的访问权(i_mode); 注意:1。两个进程必需在同一台机器上(AF_UNIX地址族);2。传递的是访问权,而不是文件描述字本身; 3。父进程执行fork()时自动复制了自己的所有已打开文件的访问权。,file ,进程打开文件表,系统打开文件表,文件 i 节点表,filename,目录项,传递,ino,打开文件,使用文件,BSD UNIX实现,filename ino,inode,socket,open,recvmsg,AF_LOCAL,sendmsg,fd1,fd2,目录项,fd2,进程2,进程1,s

38、d1,sd2,fd1,stream pipe,file,file,使用方法,单机环境下,无关进程之间或子进程向父进程可以传递文件访问权。,进程1打开文件(检查i_node访问权)得到由fd1表示的件传递访问权(r/w); 进程1把fd1传递(sendmsg)给进程2;进程2收到(recvmsg )fd1表示的文件访问权,用fd2表示;(fd1,fd2 指向同一文件) 进程2引用fd2时不需再检查i_node访问权.,r/w,i_mode,fd2,fd1,sendmsgrecvmsg,file,inode,进程1,进程2,通用读写函数: sendmsg 和 recvmsg,socket函数:#i

39、nclude recvmsg和sendmsg可以实现前面所有的读写函数的功能。ssize_t recvmsg(int sd, struct msghdr *msg, int flag); ssize_t sendmsg(int sd, struct msghdr *msg, int flag); struct msghdr caddr_t msg_name; /* 协议地址(UDP) */ int msg_namelen; /* 对于流套接字此2项为空 */struct iovec *msg_iov; /*传送数据 */ int msg_iovlen; caddr_t msg_accright

40、s; /*传送文件描述字访问权 */ int msg _accrightslen; ,msg_name msg_namelen,msg_iov msg_iovlen,msg_accrights msg_accrightslen,名字,Iov_len Iov_base,fd,iovec,buf,iovec,iovec,msghdr,Iov_len Iov_base,Iov_len Iov_base,struct iovec void *iov_base; /* 缓冲区开始的地址 */ size_t iov_len; /* 缓冲区的长度 */ ,例1. read_fd,ssize_t read_f

41、d(int fd, void *ptr, size_t nbytes, int *recvfd) struct msghdr msg;struct iovec iov1;ssize_t n;int newfd;msg.msg_accrights = (caddr_t) ,例2. write_fd,int write_fd(int fd, void *ptr, size_t nbytes, int sendfd) sruct msghdr msg;struct iovec iov1; msg.msg_accrights = (caddr_t) ,向父进程传递访问权,mycat,openfile,

42、文件,fork,exec(openfile,openfile,sockfd,pathname , mode),sockfd0,sockfd1,recvmsg(fd2),sendmsg(fd1),fd2,fd1,子进程,父进程,stream pipe,打开文件,使用文件,说明:父进程(mycat)建立一个子进程,子进程因执行一setuid文件(openfile)而拥有特权;父进程请子进程按指定mode打开pathname文件,得到文件描述字fd;然后子进程用父进程送来的sockfd1 把这一fd访问权传给父进程。 以下是编译和执行步骤:$ cc o mycat mycat.c$ cc o ope

43、nfile openfile.c$ mycat pathname 父进程文件 mycat.c 和子进程文件openfile.c见后面。,例3. 完整例子,父进程mycat.c文件,shell: $mycat pathnameargv1 int myopen(const char *, int); int main(int argc,char *argv) int fd, n;char buffBUFFSIZE;if(argc != 2)err_quit(“usage: mycat ”);if(fd = myopen(argv1, O_RDONLY) 0) /* 读传递来的fd */write(

44、STDOUT_FILENO, buff, n );exit(0); ,int myopen(const char *pathname, int mode) int fd, sockfd2, status;pid_t childpid;char c, argsockfd10, argmod10;socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);if (childpid=fork() = 0) close(sockfd0);snprintf(argsockfd, sizeof(argsockfd), “%d”,sockfd1); snprintf(argmo

45、d, sizeof(argmod), “%d”, mode); execl(“./openfile”, “openfile”,argsockfd, pathname, argmod, (char*)NULL); /* 执行openfile */ close(sockfd1);waitpid( childpid, ,子进程执行open.c文件,shell 命令: $ ./openfile sockfd pathname mode 执行文件: execl(“./openfile”, “openfile”, sockfd, pathname, mode, 0) argv0 argv1 argv2 a

46、rgv3 main(int argc,char *argv) /* openfile.c 文件*/int fd;ssize_t n;if(argc !=4) err_quit (“openfile ”);if( (fd = open(argv2, atoi(argv3) 0)? errno :255);if(n = write_fd(atoi(argv1 ), “”, 1, fd) 0)? errno :255);exit(0); ,SVR4 实现,SVR4使用ioctl命令,在流管道中 传递文件描述字。 int fds2; int fd, newfd; struct strrecvfd re

47、cvfd; . pipe(fds); if(fork() = 0) /* 子进程发送 fd */ fd = open(); ioctl(fds1, I_SEND, fd); return(0); /* 父进程接受fd */ioctl(fds0, I_RECVFD, ,pipe,文件,父进程,子进程,.I_RECVFD,ioctl,I_SENDFD,fds0,fd,newfd,fds1,六. 并发服务器与超级服务器,服务器分类并发服务器多路IO (SELECT)超级服务器inetd,客户机/服务器模型的工作实质是“请求驱动”;在网络环境中,客户进程发出请求完全随机。在同一个时刻,可能有多个客户进程向一个服务器发出服务请求;为了实现服务器的功能,在服务器的设计中要解决服务器的: 并发请求处理能力 并发服务器的进程标识 服务器安全,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报