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

干货二:Linux socket编程示例 2

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在迭代服务器中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。
5 i5 N' _9 e" H9 P3 @8 E0 R2 `, g) t/ @  b% }
     网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就fork出一个子进程专门服务这个客户端。但是子进程退出时会产生僵尸进程,父进程要注意处理SIGCHLD信号和调用wait清理僵尸进程,最简单的办法就是直接忽略SIGCHLD信号。
3 C+ i, b( a2 D" }  E. o4 P8 {
     当一个连接建立时,accept返回,服务器接着调用fork,然后由子进程服务客户(通过已连接套接字connfd),父进程则等待另一个连接(通过监听套接字listenfd)。既然新的客户由子进程提供服务,父进程就关闭已连接套接字。0 V4 W$ k8 Q8 Q
& b, a* D) J- a+ o5 S
     首先下图给出了在服务器阻塞于accept调用且来自客户的连接请求到达时客户和服务器的状态。
2 H/ T' ~% s5 n! Q; V8 `5 Z
+ o1 i% T* l, M                   2 m# ^# x0 ?" S+ b

( S7 E# l- }- ^* z& H' h     从accept返回后,我们立即就有下面的状态。连接被内核接受,新的套接字connfd被创建。这是一个已连接套接字,可由此跨连接读写数据。$ }* M7 y( o  w; `# P8 {+ P7 l% {

9 i/ S& B: \1 Q; _/ \$ a                                 / }" o, }1 e( d7 W& L  t( u

" d4 h% Z8 L* S     并发服务器的下一步是调用fork,下面是从fork返回后的状态。
8 g% [8 T& s/ ~8 d* z+ K( k2 s! `( }4 u1 j2 P
                                
4 ~% z- S6 T( e- b5 \: A5 I) c, S- [: |
- _9 C. e) F  z2 y4 [9 e4 x
     注意,此时listenfd和connfd这两个描述符都在父进程和子进程之间共享(被复制),再下一步是由父进程关闭已连接套接字,由子进程关闭监听套接字。如下图:
$ `) d( L7 {- y6 F; a/ z0 H; x
: I( l9 b, f/ W' M( e% x9 Q   
游客,如果您要查看本帖隐藏内容请回复

8 P3 l9 o7 y8 F2 |
" H" h6 N9 o/ t) |

$ G' z- a8 b0 Z$ l2 P0 k

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 02:04 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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