2009-10-14 51 views
4

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

有时,当远程服务器不响应,我得到一个连接超时错误约20秒后。超时时间通常更快。

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

是否健全覆盖在我的应用程序超时,并关闭套接字,如果我无法X秒内连接?

(这也许无关紧要,但应用程序是用C++构建并使用异步网络通信I/O完成端口)

回答

2

在Linux上,你可以

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

减少(或增加)SYN重数量每个套接字尝试每个连接。不幸的是,它不能移植到Windows。

至于你提出的解决方案:关闭套接字,而它仍然处于连接状态应该是罚款,这可能是最简单的方法。但是,由于听起来您已经在使用异步完成,您是否可以尝试一次打开四个连接?如果所有四个时间了,至少它会只需要20秒而不是80

1

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

见TcpMaxConnectRetransmissions

+1

如果他们不介意覆盖全球所有其他用户和程序... – ephemient 2009-10-14 19:37:43

1

你可能会考虑尝试一次(每个都有自己的插座)打开多个连接,然后首先响应的一个工作。其他人可以关闭。

您可以使用非阻塞打开调用或阻塞调用和线程来做到这一点。那么等待连接打开的滞后不应该超过最低限度的诡计。

+0

您也可以使用阻止呼叫并选择() – sbk 2009-10-14 20:31:39

1

当您重写套接字超时时,您必须非常小心。如果你太积极并且试图很快连接到许多服务器,那么Windows TCP/IP堆栈会认为你的应用程序是一个互联网蠕虫并且将其扼杀。如果发生这种情况,那么应用程序的性能会变得更糟。

时完全限制后面出现不通告的细节,但你提出的超时(5秒)应该确定,在我的经验。

可用关于这个细节可以发现here

+0

TCP连接的throtling是仅客户端操作系统特性(XP,Vista)。一个服务器产品(Windows 2003,Windows 2008)没有任何争执。 – 2009-10-14 20:34:11

+0

提问者和绝大多数读者似乎正在使用XP或Vista。 – ravenspoint 2009-10-14 21:14:59

5

如果使用IO完成端口和异步操作,为什么还需要等待连接到与名单上的下一台服务器完成后再继续?使用ConnectEx并通过重叠结构。这样个人服务器连接时间将不会加起来,总连接时间是最大服务器连接时间而不是总和。

+0

所以你建议我像以前一样连接到很多外部服务器?但是当我连接时,我必须将数据发送到这些服务器。我必须执行一系列活动,例如本地文件访问和计算等。如果我连接到100个不同的服务器,并且它们都直接响应,我将不得不在100个并行线程中执行本地计算,否则,我必须很慢,在这种情况下,他们可能会断开连接时间太长。本地的东西不会按照这种方式进行扩展。所以对我来说,你的建议听起来像一个糟糕的主意。 – Nitramk 2009-10-25 18:51:54

+0

http://en.wikipedia.org/wiki/Deus_ex_machina – 2009-10-25 19:14:02

相关问题