如何关闭TCP链接?
1、错误的做法:send() + close()
因为如果有数据在发送缓存区中,close()会导致RST,导致链接过早断掉,造成接收端收不完整数据;
2、 正确做法:(未定义报文格式)
-
发送端:send() + shutdown(WR) + read()返回0 + close()
-
接收端:read()返回0 + 没有要发送的数据了 + close()
忽略SIGPIPE
当客户端关闭socket,二此时服务端正在进行发送操作,客户端就会收到SIGPIPE信号,信号的默认动作会把服务端杀掉,进而会影响到其他别的客户端。
打开Nagle’s algorithm,即打开TCP_NODELAY
N算法的思想是将发送的tcp数据进行缓存,不必一包一确认,可以降低网络延迟。