2017-06-21 26 views
0

我得到了下面的例子(通過:馬特S)在cmd中升高的模式下運行:How do you test the Push Notification feedback service?連接從Delphi紅寶石tcpserver的使用印

我可以通過使用「遠程登錄本地主機2196」連接到這紅寶石服務器和它的開始發送數據到telnet客戶端就好了。

但是,如果我再嘗試把這個在Delphi中使用,使用印:

TcpClient := TIdTcpClient.Create(nil); 
    TcpClient.Host := 'localhost'; 
    TcpClient.Port := 2196; 
    TcpClient.Connect; 

我得到以下錯誤:套接字錯誤#10061連接,只要「連接」被稱爲拒絕。看起來似乎無法找到tcp服務器。

我在這裏可能會做錯什麼?

回答

1

該錯誤表示服務器未在127.0.0.1上進行偵聽。服務器可能正在監聽其他本地IP,而無需在127.0.0.1上進行監聽。

localhost並不一定指127.0.0.1。通過gethostbyname()getaddrinfo()的查詢查詢可以將localhost解析爲實際的本地IP,然後telnet將嘗試連接到一個成功。

但目前的Indy只把作爲localhost127.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()爲每一個,直到一個成功或循環結束。

+0

不幸的是,使用127.0.0.1給了我同樣的問題。另外,在telnet上嘗試127.0.0.1 - 也不能正確連接它 - 而localhost上的telnet確實有效。 –

+1

我知道,那是我想要做的。當服務器沒有主動監聽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。 –

+0

不錯 - 從來不知道。虐待測試很快。另一個也許更直接的解決方案是明確告訴Ruby在127.0.0.1 - > server = TCPServer.open(「127.0.0.1」,2196) –