【发布时间】:2018-03-07 22:41:44
【问题描述】:
Windows socket close(closesocket) 函数生成RST。
在 linux 上,当我调用 close 函数来关闭一个 tcp 套接字时,它会通过来自客户端服务器的 fin/ack 并且套接字被关闭。
但是在 windows winsock 上,每当我调用 closesocket 时,它总是会生成 RST 消息。
我尝试使用关机调用。它正在生成 FIN。但最后我必须调用 closesocket 并发送 RST。
有没有办法调用closesocket释放socket资源而不发送RST消息。
【问题讨论】:
-
在那之前你在做什么?你读过所有传入的数据吗?你在套接字上弄乱了 SO_LINGER 吗?
-
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); iResult = 关机(ConnectSocket,SD_SEND);关闭套接字(连接套接字); WSACleanup();我已经完成接收所有数据。但在我看来,Windows 套接字从不通过四路 FIN/ACK 来关闭套接字。每当调用 colsesocket 或使用 SD_BOTH 调用关闭时,它总是发送 RST。我正在寻找一种方法来关闭 Windows 套接字上的四路 FIN/ACK,因为它发生在 linux 上。
-
您不应在 cmets 中发布代码。将其添加到您的问题中。但有证据表明您还没有阅读所有传入的数据。你真的
recv()直到你得到零回报吗? -
很抱歉给您带来了困惑。你说的对。我不是在等待 recv() 返回零。在我的情况下,服务器是源,客户端是接收器。我有一些想关闭客户端套接字的情况。客户端套接字 SO_LINGER 设置为 (ld.l_onoff = 1, ld.l_linger = 10)。在这种情况下,我使用 SD_SEND 调用关闭客户端套接字,然后调用 closesocket。我希望客户端等到 10 秒才能读取所有数据,如果没有数据在不发送 RST 的情况下优雅地关闭。如果 10 秒后有任何数据,则发送 RST。
-
嗯? SO_LINGER 设置意味着客户端在关闭套接字时将等待长达 10 秒以发送所有待处理的数据。它可以等待长达 10 秒以接收数据的唯一方法是通过 SO_RCVTIMEO 或
select()和recv()调用。
标签: tcp winsock closesocket