socket编程(3)——tcp陷阱
一.如何正确关闭tcp连接
主动关闭端:send() -> shutdown(WR) -> read()=0 -> close()
被动关闭: read()=0 -> 如果没有要发送的数据 -> close()
原因:如果协议栈接收缓冲区有数据,但是程序调用了close,会发送rst分节,强行终止连接,造成发送数据不完整
note:主动关闭的一端无法确定对方是否数据已经收全,对方可能程序crash,read仍然返回0,这时候如果需要更强的保证,可以设计合理的协议来确保对方已经收到
二.自连接
linux协议栈会出现自连接的情况,原因是tcp的同时打开功能,可以在网络库中加简单的判断来避免
三.SIGPIPE
如果向一个已经关闭的socket写数据,会收到SIGPIPE信号,网络库需要忽略这个信号,不然会程序终止
四.Nagle
nagle算法会严重影响请求响应式协议的延时,tcp中应该默认禁用nagle算法
五.reuseaddr
服务端应该设置这个选项,可以保证服务端程序关闭后立刻重启