Notes:
1 多进程的server程序, 记得要处理SIG_CHLD signal, 否则会有zombie process存在
2 TCP server clien Senario:
2.1 Client abort before server's accept() return: -client 在和server完成三次握手后close, 向server发送RST。这个通过设置socket option SO_LINGER 来实现。server accept的动作在各个系统的实现中不同。
2.2 Server 被关掉了, client 被block在stdin。server向client发送 FIN1, client发送ACK,连接处于半连接状态。client输入字符发送后, 能够正常从connection中读出数据,client 向server发送FIN和收到ACK,这时connection已经close了。再次发送数据,会得到SIGPIPE的错误。如和解决这种两次发送后才得到server已经shutdown的信息呢?通过两次written到server来实现。
2.3 server crash了: 因为server不会发送ACK到client, client 会向server一直发送数据,直到TIMEOUT。我们可以通过keep alive机制来快速检测这种情况。
2.4 server crash and reboot: 因为server crash了,client会向server一直发送数据。当server恢复后,收到client的数据包后,会向client发送RST,因为之间connection的信息已经丢了. 连接中断。
2.5 server shut down. server收到SIGTERM后,会向client发送FIN。其情况与2.2 类似。