完成端口如何优雅地关闭socket

时间:2022-03-26 23:52:32
小弟写了一个完成端口的socks5代理服务器做转发。用了以下代码来关闭socket的时候发现根本不能正常地关闭。直接就rst,ack了。大家可以看下图 完成端口如何优雅地关闭socket
图上所示红色部分就是执行下面代码的结果,根本不是正常关闭socket。
linger lg = {1, 10}; // 表示延迟打开,延迟10秒  
setsockopt(m_socket, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(linger));  
shutdown(m_socket, SD_BOTH); // 也可以设置第二个参数为SD_SEND或SD_RECEIVE  
closesocket(m_socket);


我就是用的此代码测试的。完全不起作用。直接就是发送rst关闭 并没有发送fin,ack来正常关闭。
还请各位前辈指点一下。小弟不盛感激!

7 个解决方案

#1


把 shutdown 换成 CancelIo((HANDLE)m_socket) 试试

#2


把shutdown去掉试试

#3


解决方案就是由收到最后一个包的那端closesocket()!!!!
完成端口如何优雅地关闭socket

#4


As long as the read buffer TCP stack there unread (read) data, then calling close will report directly to the end to send the RST

#5


引用 1 楼 Sandrer 的回复:
把 shutdown 换成 CancelIo((HANDLE)m_socket) 试试

如图一模一样!

#6


引用 2 楼 VisualEleven 的回复:
把shutdown去掉试试

去掉也试了  还是跟上面图片上的一模一样

#7


引用 3 楼 zhao4zhong1 的回复:
解决方案就是由收到最后一个包的那端closesocket()!!!!
完成端口如何优雅地关闭socket

问题是现在的情况是我TCP服务器主动断开,您说的那样到底是怎么弄的。

#1


把 shutdown 换成 CancelIo((HANDLE)m_socket) 试试

#2


把shutdown去掉试试

#3


解决方案就是由收到最后一个包的那端closesocket()!!!!
完成端口如何优雅地关闭socket

#4


As long as the read buffer TCP stack there unread (read) data, then calling close will report directly to the end to send the RST

#5


引用 1 楼 Sandrer 的回复:
把 shutdown 换成 CancelIo((HANDLE)m_socket) 试试

如图一模一样!

#6


引用 2 楼 VisualEleven 的回复:
把shutdown去掉试试

去掉也试了  还是跟上面图片上的一模一样

#7


引用 3 楼 zhao4zhong1 的回复:
解决方案就是由收到最后一个包的那端closesocket()!!!!
完成端口如何优雅地关闭socket

问题是现在的情况是我TCP服务器主动断开,您说的那样到底是怎么弄的。