我应该实现自己的TCP / IP套接字超时吗?

时间:2009-10-14 19:20:48

标签: c++ windows sockets tcp timeout

我正在使用的软件需要能够在短时间内使用TCP / IP连接到许多服务器。该软件在Win32下运行。如果服务器没有响应,我希望能够快速继续列表中的下一个服务器。

有时当远程服务器没有响应时,我会在大约20秒后收到连接超时错误。超时通常会更快。

我的问题是,这20秒会损害我的软件性能,我希望我的软件能够更快地放弃(比如5秒后)。我假设Windows中的TCP / IP堆栈(?)会根据某些参数自动调整超时?

在我的应用程序中覆盖此超时是否合理,如果我在X秒内无法连接,请关闭套接字?

(可能不相关,但应用程序是使用C ++构建的,并使用I / O完成端口进行异步网络通信)

5 个答案:

答案 0 :(得分:5)

如果您使用IO完成端口和异步操作,为什么在继续列表中的下一个服务器之前需要等待连接完成?使用ConnectEx并传入重叠结构。这样单个服务器连接时间就不会加起来,总连接时间是最大服务器连接时间而不是总和。

答案 1 :(得分:3)

在Linux上你可以

int syncnt = 1;
int syncnt_sz = sizeof(syncnt);
setsockopt(sockfd, IPPROTO_TCP, TCP_SYNCNT, &syncnt, syncnt_sz);

减少(或增加)每个连接每个连接的SYN重试次数。不幸的是,它无法移植到Windows。

至于你提出的解决方案:在套接字处于连接状态时关闭套接字应该没问题,这可能是最简单的方法。但是,因为听起来你已经在使用异步完成,你可以简单地尝试一次打开四个连接吗?如果全部四次超时,至少只需要20秒而不是80秒。

答案 2 :(得分:1)

Windows的所有可配置TCP / IP参数均为here

请参阅TcpMaxConnectRetransmissions

答案 3 :(得分:1)

您可能会考虑尝试一次打开多个连接(每个连接都有自己的套接字),然后使用首先响应的连接。其他人可以关闭。

您可以使用非阻塞打开调用或阻塞调用和线程来执行此操作。然后等待连接打开的延迟不应该只是最低限度的。

答案 4 :(得分:1)

覆盖套接字超时时必须小心。如果你过于激进并试图很快连接到许多服务器,那么Windows TCP / IP堆栈将假定你的应用程序是一个互联网蠕虫,并将其限制。如果发生这种情况,那么应用程序的性能将变得更糟。

根据我的经验,没有公布确切发生限制的详细信息,但建议的超时(5秒)应该没问题。

可以找到有关此内容的详细信息here