数据重传和 WSAECONNABORTED (10053) 套接字错误

use*_*236 5 networking windows tcp sockets

假设我有两个相互连接的套接字(Socket ASocket B)。

如果已经Socket B拔掉电源的计算机,如果Socket A尝试向 发送一些数据Socket B,数据将不会得到确认,因此 TCP 会一次又一次地重新传输数据以希望得到确认,直到 TCP 放弃并决定不重新传输数据不再并告诉发生Socket A了套接字错误WSAECONNABORTED (10053)

我的问题是:

  • 是否可以保证WSAECONNABORTED (10053)在重传重试后我总是会收到套接字错误(我相信是这样,否则 TCP 将永远继续重传!)?
  • TCP 决定放弃并导致WSAECONNABORTED (10053)套接字错误需要多少次重传重试?
  • 这个重传重试次数可以配置吗?

Dav*_*ill 0

通常使用时间(不断重试,直到达到超时值),但这取决于客户端/服务器软件的编写方式。

\n\n

如果使用时间,那么为了知道重试次数,您必须知道重试发生的频率。

\n\n

如果程序使用 Winsock,请参阅下文,了解设置超时的可能方法。

\n\n

该软件还可以编写为使用失败前的重试次数或失败前的时间或两者的组合。

\n\n
\n\n

源码Winsock Programmer\xe2\x80\x99s 常见问题解答

\n\n
\n

2.15 - 如何更改 Winsock 函数的超时?

\n\n

某些阻塞 Winsock 函数(例如 connect())嵌入了超时\n。这背后的理论是,只有堆栈拥有设置适当超时所需的所有信息。然而,有些人发现堆栈使用的值对于他们的应用程序来说太长;可以是一分钟或更长时间。

\n\n

您可以使用 SO_SNDTIMEO 和\n SO_RCVTIMEO setsockopt() 选项调整 send() 和 receive() 超时。。

\n\n

对于其他 Winsock 函数,最好的解决方案是完全避免阻塞套接字。所有非阻塞套接字方法都提供\n 构建自定义超时的方法:

\n\n
    \n
  • 使用 select() 的非阻塞套接字 \xe2\x80\x93 select() 函数的第五个参数是超时值。

  • \n
  • 异步套接字 \xe2\x80\x93 使用 Windows API SetTimer()。

  • \n
  • 事件对象 \xe2\x80\x93 WSAWaitForMultipleEvents() 有一个超时参数。

  • \n
  • 可等待计时器 \xe2\x80\x93 调用 CreateWaitableTimers() 创建一个可等待计时器,然后您可以将其与套接字一起传递给 WSAEventSelect()\n 等函数:如果在计时器运行之前没有任何套接字发出信号off,阻塞函数无论如何都会返回。

  • \n
\n\n

请注意,使用异步和非阻塞套接字,您可以完全避免处理超时。即使 Winsock 正忙,您的程序仍会继续工作。因此,您可以让用户取消\xe2\x80\x99s 花费太长时间的操作,或者只是让 Winsock\xe2\x80\x99s\n 自然超时过期,而不是接管此功能\你的代码。

\n
\n