該錯誤表示服務器未在127.0.0.1
上進行偵聽。服務器可能正在監聽其他本地IP,而無需在127.0.0.1
上進行監聽。
localhost
並不一定指127.0.0.1
。通過gethostbyname()
或getaddrinfo()
的查詢查詢可以將localhost
解析爲實際的本地IP,然後telnet
將嘗試連接到一個成功。
但目前的Indy只把作爲localhost
127.0.0.1
,沒有試圖動態解決它:
function TIdStack.ResolveHost(const AHost: string;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION): string;
begin
Result := '';
case AIPVersion of
Id_IPv4: begin
// Sometimes 95 forgets who localhost is
if TextIsSame(AHost, 'LOCALHOST') then begin {Do not Localize}
Result := '127.0.0.1'; {Do not Localize}
end else if IsIP(AHost) then begin
Result := AHost;
end else begin
Result := HostByName(AHost, Id_IPv4);
end;
end;
Id_IPv6: begin
if TextIsSame(AHost, 'LOCALHOST') then begin {Do not Localize}
Result := '::1'; {Do not Localize}
end else begin
Result := IdGlobal.MakeCanonicalIPv6Address(AHost);
if Result = '' then begin
Result := HostByName(AHost, Id_IPv6);
end;
end;
end;
else begin
IPVersionUnsupported;
end;
end;
end;
即使印地試圖解決localhost
作爲主機名,它不會試圖連接到所有報告的IP地址。這是Indy問題列表上的TODO item。
我的建議是與getaddrinfo()
手動解決localhost
,然後使用一個循環通過IP地址上報運行,重置TIdTCPClient.Host
(也可能是TIdTCPClient.IPVersion
),並呼籲TIdTCPClient.Connect()
爲每一個,直到一個成功或循環結束。
不幸的是,使用127.0.0.1給了我同樣的問題。另外,在telnet上嘗試127.0.0.1 - 也不能正確連接它 - 而localhost上的telnet確實有效。 –
我知道,那是我想要做的。當服務器沒有主動監聽127.0.0.1時,客戶端無法連接到127.0.0.1。將服務器綁定到「0.0.0.0」並不保證綁定到「127.0.0.1」。客戶端必須使用服務器實際正在監聽的IP進行連接。 Indy僅將'localhost'視爲'127.0.0.1',它不會嘗試將'localhost'解析到其他本地IP。 –
不錯 - 從來不知道。虐待測試很快。另一個也許更直接的解決方案是明確告訴Ruby在127.0.0.1 - > server = TCPServer.open(「127.0.0.1」,2196) –