找回密码
 注册
关于网站域名变更的通知
查看: 292|回复: 1
打印 上一主题 下一主题

干货二:Linux socket编程示例 2

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-17 21:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。
3 u' [0 E0 F% V$ \( q* p" Y! K. m0 l# w2 W
     网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和调用wait清理僵尸进程,最简单的办法就是直接忽略SIGCHLD信号。1 |" }( e: a% p. r$ e1 n

6 o( z4 c6 @" z9 D4 J     当一个连接建立时,accept返回,服务器接着调用fork,然后由子进程服务客户(通过已连接套接字connfd),父进程则等待另一个连接(通过监听套接字listenfd)。既然新的客户由子进程提供服务,父进程就关闭已连接套接字。3 N) i" K. g7 {8 [
" y) H; g! i2 _  K
     首先下图给出了在服务器阻塞于accept调用且来自客户的连接请求到达时客户和服务器的状态。
7 D  C5 @$ L3 P; W- E, c7 L# Q, s* [0 F7 ~: W1 B1 L* n
                  
& p0 P5 `: t2 {9 U% A4 x
: S0 _) B, A" m* Y+ u! n     从accept返回后,我们立即就有下面的状态。连接被内核接受,新的套接字connfd被创建。这是一个已连接套接字,可由此跨连接读写数据。6 P! [8 |8 H0 r, @1 e- A' \$ p, B

) R) @$ O/ q' j; \' z                                 
' _& }# t9 V( n
, V4 k3 F: V% W# h     并发服务器的下一步是调用fork,下面是从fork返回后的状态。
: j6 C2 |+ o( Y+ ]2 C0 p3 G. ?
/ P( a- v( k! c& x2 ?: Z                                
1 _" D+ z# ~! C9 X
- p+ y: y4 {1 }/ H/ G$ f. w9 w
8 ~* d: r  r" O+ c1 L7 V! N     注意,此时listenfd和connfd这两个描述符都在父进程和子进程之间共享(被复制),再下一步是由父进程关闭已连接套接字,由子进程关闭监听套接字。如下图:
5 n" y" ]5 Y: s- L+ O
4 T/ x) x& b* U$ T, |& [3 b* q6 P   
游客,如果您要查看本帖隐藏内容请回复
5 z! \; i0 d- H; v& t' ]+ Y

+ d  c; F- ^0 ~8 t

! y# V$ V7 @/ p

该用户从未签到

2#
发表于 2019-9-25 18:44 | 只看该作者
好东东必须顶。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:23 , Processed in 0.187500 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表