在上一版本的回射程序中,若服务器子进程被杀死,则客户端检测不到这一事件的发生。原因在于,子进程被杀死时,虽然发送了FIN给客户端套接字,但此时客户端进程是阻塞于等待标准输入上的,因此检测不到套接字的输入。解决办法就是使用I/O多路复用。如下图所示:
另一个问题:若输入是批量输入,则输入结束后,客户端检测到EOF,则客户端会关闭连接,而网络中还有其他请求和应答,则会发现输出比输入少的现象,如下图所示
当全部的9个请求发出后,则会关闭连接,而此时只有应答1被接收到,其他的会丢失。
解决办法就是请求全部发送后,只关闭套接字写的那端,不关闭读的那端,也即半关闭状态
为此,使用了select来进行I/O多路复用。程序如下:
客户端:
#include <stdio.h>
#include <sys/soc