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

干货二:Linux socket编程示例 2

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。
! D) a9 \% I' }. k- k2 r
+ a' L7 [  c. {. y     网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和调用wait清理僵尸进程,最简单的办法就是直接忽略SIGCHLD信号。
8 O; n/ G. R% h3 C! B- p8 \
) h" |# n! |' \3 p, ^6 T     当一个连接建立时,accept返回,服务器接着调用fork,然后由子进程服务客户(通过已连接套接字connfd),父进程则等待另一个连接(通过监听套接字listenfd)。既然新的客户由子进程提供服务,父进程就关闭已连接套接字。
/ x: s, Y+ c" g! e( y7 z8 D7 L
     首先下图给出了在服务器阻塞于accept调用且来自客户的连接请求到达时客户和服务器的状态。
9 _$ r+ R2 @: d: y+ j) }3 q! h$ L1 w& Q% {; u8 O" M0 _8 o0 k
                  
# u4 T* H. b) ?. S# H6 F- M; C% z8 r& {% n/ T
     从accept返回后,我们立即就有下面的状态。连接被内核接受,新的套接字connfd被创建。这是一个已连接套接字,可由此跨连接读写数据。  X: B, ^. O6 n6 Q1 h& j' k
' P0 q0 {$ I' F: n
                                 ) l' F, h6 C1 W5 R
) t: {5 b: _) V/ }3 a( D* S
     并发服务器的下一步是调用fork,下面是从fork返回后的状态。1 v% N( C, D) i6 b+ R! z5 c
8 L, P" Q+ s2 k- m
                                
& \" d" E  {& c7 O2 q; w( w+ r$ R' y( L3 x/ C  d0 @

' }; a4 z! F: F     注意,此时listenfd和connfd这两个描述符都在父进程和子进程之间共享(被复制),再下一步是由父进程关闭已连接套接字,由子进程关闭监听套接字。如下图:
) S& Q5 @- E, c4 \, y$ B% S' Q' y5 ]+ z4 i4 M! O* v0 ~7 F' H
   
游客,如果您要查看本帖隐藏内容请回复
& e1 k+ Q7 k4 X5 d# t
  v9 o* C+ W) e1 r) z
2 r$ ?- e- V+ [

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 00:39 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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