windows - Windows Socket #10060 错误(WSAETIMEDOUT - 尝试连接超时但未建立连接)是否完全是编程错误?

标签 windows sockets delphi indy indy10

我有使用 Indy HTTP 组件(使用 Windows 套接字)的 Delphi 应用程序。在执行 Indy 过程时,我有时会收到 #10060 套接字错误(WSAETIMEDOUT - 尝试连接超时但未建立连接):

CheckForSocketError(IdWinsock2.Connect(ASocket, @LAddr, SizeOf(LAddr)));
...
connect : TconnectProc;
...
TconnectProc = function ( const s: TSocket; const name: PSockAddr; const namelen: Integer): Integer; stdcall;

实际上所有这些只是围绕 Windows 连接函数 https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect给出错误和消息 WSAETIMEDOUT。所以 - 我的问题是 - 这可能是编程错误吗?即使我在另一台计算机上运行服务器,甚至该服务器在服务请求时遇到问题,即使在这种情况下,低级连接也应该正常执行,如果服务器无法服务 GET/POST 请求,那么当然是错误应该是,但是这些错误应该只在执行不在 connect 中的其他 Socket 函数期间出现。功能,不是吗?

我正在尝试解决我的问题 https://serverfault.com/questions/973648/is-it-possible-that-unencrypted-traffic-can-cause-windows-socket-10057-10060?noredirect=1#comment1266907_973648现在我正在寻找我的代码中发生的事情。

我的服务器端代码非常简单 - 它只是已实现的 TIdHttpServer 组件(我仅在此处提供事件名称):
MyForm.IdHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

所以-我的实现可以穿什么,什么可以导致WSAETIMEDOUT的出现对于 connect ?是的,我的程序有时可能会很长,但多年来它成功地返回了答案并且没有通信错误。而且我猜,连接函数甚至可以不依赖(不使用/引发) OnCommandGet 事件,所以,我无法控制服务器端如何处理来自客户端的套接字连接函数?

这可能与 TCP(不是 HTTP)keepalive 连接,也许某些 Windows 更新减少了客户端的 Windows TCP keepalive 客户端设置,现在这表现为此类错误。

最佳答案

Indy TCP 客户端,如 TIdHTTP , 公开ConnectTimeout属性,默认设置为 0(无限)。如果未指定超时,则在客户端的 TIdTCPClient.Connect() 时使用硬编码的 2 分钟超时。方法在主 UI 线程中调用,TIdAntiFreeze处于事件状态,否则不使用超时。

如果使用超时,Indy 会调用 Winsock 的 connect()工作线程中的函数并等待该线程终止。如果 Indy 的超时时间过去,则关闭套接字以中止 connect() ,然后是 EIdConnectTimeout向调用者提出。如果 connect()在 Indy 超时之前退出,只有在 connect() 时才会向调用者引发异常失败的。

如果不使用超时,Indy 调用 Winsock 的 connect()直接,等待它自行退出,然后仅在失败时引发异常。

因此,您获得 WSATIMEDOUT 的唯一方法是Indy 在调用 Winsock 的 connect() 时出错函数是在 Indy 自己的超时时间过去之前 Winsock 本身是否在内部超时。这并不一定表明您的代码存在问题。这只是意味着 Host您正在尝试连接的那个时间根本无法访问。如果服务器可以访问,但无法接受您的连接,您将收到不同的错误,例如 WSAECONNREFUSED .

如果您的服务器位于防火墙或路由器后面,请确保它没有阻止连接到达您的服务器。尝试在服务器机器上运行数据包嗅探器,例如 WireShark,并确保来自 TIdHTTP 的 3 次 TCP 握手正确到达服务器计算机。

关于windows - Windows Socket #10060 错误(WSAETIMEDOUT - 尝试连接超时但未建立连接)是否完全是编程错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56848655/

相关文章:

windows - 在 Windows 中使用 OpenAI API key 时出现问题

c++ - 如何在不分割的情况下在一个包中接收 TCP 套接字数据

delphi - 如何在 TWebBrowser IDispatchEvent 中获取自定义事件参数

delphi - Word 自动化仅适用于管理员,或者在创建 word.application 后会出现延迟

c++ - 调用 ResetEvent() 时是否需要互斥或锁定?

Python读取Windows命令行输出

c - 非阻塞套接字选择在连接后返回 1

sockets - 在 Luasocket 中,即使在 select 告诉它可以安全读取之后,在什么情况下 accept 调用也会阻塞?

wcf - Delphi Win32客户端中使用WCF服务(basicHttpBinding)的问题

尝试使用 asyncio 子进程调用 shell 命令时,Python 引发 NotImplementedError