我有使用 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/