Lomo's BLOG

行之而不著焉 习矣而不察焉 终身由之而不知其道也 众也 ~
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对例子程序的一些思考

Posted on 2006-05-03 11:42  Lomo  阅读(297)  评论(0)    收藏  举报

1_服务器进程终止:启动服务器&客户,杀死服务器子进程,此时引发一个FIN发给客户,客户TCP给予相应ACK,TCP连接终止工作完成一半,父进程处理SIGCHLD后发FIN至客户端套接口,但客户端正阻塞于fgets调用,这便是问题所在。客户工作时有两个描述字:套接口和用户输入,它不能仅仅阻塞于其中某个特定的源,而应该阻塞于任意源的输入。这正是函数select&poll的一个目的。

2_服务器主机崩溃:启动服务器&客户,断开服务器网络连接,此时服务器无法向客户端发送任何数据(服务器主机崩溃时发生),我们在客户上键入一行,阻塞于readline等待回射,用tcpdump查看可以发现客户端持续重传分节,试图获得服务器ACK,最后客户返回ETIMEDOUT。

3_服务器主机崩溃后重启:启动服务器&客户,断开服务器网络连接,此时服务器无法向客户端发送任何数据(服务器主机崩溃时发生),我们在客户上键入一行,阻塞于readline等待回射,服务器重启完成后丢失了所有TCP连接信息,因此服务器对TCP分节予以RST响应。RST到达客户端,引发ECONNRESET错误。

4_服务器主机关机:UNIX系统关机,一般是由init进程给所有进程发出信号SIGTERM(可以捕获),等待一段时间后给还在运行的进程发SIGKILL(无法捕获),中止进程,然后将发生第一点所讲到的情况。

5_在例子中,服务器对从客户接受到的请求从未检查,直接回射,这并不是一个通常的规则,我们往往需要关心客户和服务器之间交换的数据格式。在其中,需要特别注意到的是关于数值得传送关系到系统的字节序,一种简单的处理方法是把数值转换成文本串来传输。