文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
为每个客户端 fork() 一个子进程
客户端连到服务器以后会启用一个新创建的套接字对话,也就是说主服务器套接字可以去找下一个客户端,我们来试试。
当客户端连接时,可以用
fork() 克隆一个独立的子进程来处理它和服务器之间的对话。
当客户端在与子进程通信时,服务器的父进程可以继续连接下一个客户端。
父子进程使用不同套接字
有一件事你必须铭记于心,服务器的父进程只需要用主监听套接字(用来接受新的连接),而子进程只需要处理 accpet() 创建的副套接字。也就是说,父进程克隆出子进程后可以关闭副套接字,而子进程可以关闭主监听套接字。
这里没有蠢问题问:如果为每个客户端都创建新进程,那么当有无数客户端连接服务器时计算机上岂不是会有无数进程?答:是的,如果你觉得会有很多客户端连接服务器,就需要控制创建进程的上限。子进程在处理完一个客户端后可以向你发出信号,利用这点就可以用有限的子进程处理无限的客户端。
磨笔上阵
我们修改了服务器的代码,现在它能克隆独立的子进程来和客户端通信……眼看就要完成了,你能找到漏掉的代码吗?
磨笔上阵解答
我们已经修改了服务器的代码,现在它能克隆独立的子进程来和客户端通信……眼看就要完成,你将找出漏掉的代码。
试驾
试试修改后的服务器,你可以像刚刚一样编译运行。
打开另一个控制台,启动 telnet,像刚才一样连接:
看起来没什么区别,但只要你让客户端在笑话讲到一半的时候停在那里,就能看到修改后的效果:
假如你打开第三个控制台,就可以看到服务器现在有两个进程:一父一子:
即使第一个客户端还在和服务器通信,你仍然可以连接服务器:
你已经创建了一个互联网服务器,下面就来看看如何创建客户端,我们来写一个可以读取网页内容的程序。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论