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

Nit*_*amk 5 c++ sockets windows timeout tcp

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

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

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

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

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

eph*_*ent 5

在 Linux 上你可以

int syncnt = 1;
int syncnt_sz = sizeof(syncnt);
setsockopt(sockfd, IPPROTO_TCP, TCP_SYNCNT, &syncnt, syncnt_sz);
Run Code Online (Sandbox Code Playgroud)

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

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


Rem*_*anu 5

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