【问题标题】:tcp closesocket method of winsock generating reset (RST)winsock 生成复位 (RST) 的 tcp closesocket 方法
【发布时间】: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


【解决方案1】:

有几件事会导致 closesocket() 发送 RST 而不是 FIN:

  1. 当套接字接收缓冲区中有未读数据挂起时调用它。
  2. 在将 SO_LINGER 选项设置为“on”且超时为零后调用它。

【讨论】:

    【解决方案2】:

    如果没有更多数据要发送和/或接收,您可以使用“shutdown()”。

    例如:关机(clisocket,SD_BOTH);

    【讨论】:

    • 不以任何方式回答问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2018-06-19
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多