C++入门到放弃(二),EchoServer与fork模型

目标

EchoServer,就是客户端输入什么,服务器接收后以同样的数据返回。

代码


我们在上一章节的代码上新增了如下的代码,这段代码的意思是当能够从socket里面读出数据时,我们将原数据写回。我们用telnet可以测试这么一段代码。
当时我们很快也发现,我们一次只能够接受客户端的连接,当我们用第二个telnet的时候,发现程序并没有得到我们预期的结果。这是因为程序阻塞在了read函数中。所以,我们需要一个多进程/多线程的模型来支持这样的操作。

fork函数

fork函数可以用来创建一个新的进程。新的进程是对父进程的拷贝。

  • 第7行,我们使用fork函数来申请一个子进程。fork函数有两次返回(主进程一次,子进程一次,我们通过pid来判断是主进程还是子进程。)

我们注意到子进程中x的值也是1024,同时也打印出"program over",因为子进程是对父进程的一个拷贝。

fork网络模型

fork网络模型是一种简单而又常见的网络模型,其主进程负责监听有没有新的连接,但accept到一个新的链接后,主进程会创建一个子进程,让子进程处理与客户端的通信。

  • 81-87行,当我们accpet到一个客户端的时候,我们fork一个新的进程,并让子进程执行DoEcho的操作,这里我们注意到一个很有趣的现象。因为子进程是复制主进程,所以两个进程同时维持该socket链接。所以我们需要关闭掉一个。

为了验证我们刚刚的说法,我们把上文低84行的注释去掉
,我们在我们在DoEcho的时候输出操作的主进程号。


我们看到了父进程与子进程分别进行了一次doecho的操作。从client链接我们也发现需要2次关闭。


同理,子进程也可以关掉listen socket。最后,代码如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,889评论 24 1,002
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,776评论 25 709
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 5,698评论 0 4
  • 这是关于How To Read A Book 翻译的第六篇文章。采取概括意译的方式,去粗存精,突出重点句子。文中自...
    西北的星空阅读 4,084评论 0 1
  • 故事的开头总是这样,适逢其会、猝不及防;故事的结尾也总是这样,花开两朵、天各一方。曾经,那些让人羡慕嫉妒恨的恩爱终...
    叫我八分青年阅读 1,709评论 0 1