目标
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。最后,代码如下:
网友评论