这几天分别测试Mongoose和Libhv这俩开源网络框架,在用作TCP客户端时,都遇到了主动与服务端断开连接后依然处于TIME_WAIT状态。具体原因就是网络编程的比较底层的知识了,简单的来说就是TCP的四次挥手关闭连接机制没有正常结束导致。
一个简单粗暴的方法是修改socket的SO_LINGER
设置:
linger optLinger;
optLinger.l_onoff = 1;
optLinger.l_linger = 0;
setsockopt(fd, SOL_SOCKET, SO_LINGER, (const char*)&optLinger, sizeof(linger))
虽然会导致closesocket时强行关闭连接,尚未发出的所有数据都会丢失,但至少可以避免长时间的处于TIME_WAIT状态。