2011-05-18 132 views
0

我有一個簡單的程序,我正在開發該程序,以在我的公司在客戶端控制的遠程計算機上執行一些帶寬測試。該程序的一個副本在遠程計算機上,並被告知在指定的端口上進行偵聽。然後告知同一程序的另一個副本連接到監聽計算機,然後發送帶有已知長度消息的隨機內容的序列化對象。傳輸是定時的,並將結果發送回原始機器。程序正在偵聽TCP端口,但連接到該端口被拒絕

它在環回接口上正常工作;兩個節目正在進行中,一個在監聽一部分,另一個連接到同一個端口(以共享的方式)併發送數據。但是,當我將該測試的「遠程」端移動到同一個Intranet上的不同測試機器上時,即使該程序表示正在「監聽」其連接,該端口也無法通過我的開發機器上的程序連接到該端口。我收到標準錯誤「由於目標機器主動拒絕,無法建立連接」。

這兩臺計算機之間沒有主動防火牆,包括Windows防火牆。我可以創建其他類型的遠程連接,例如VNC。

下面是相關的代碼片段:

偵聽連接:

public void BeginListeningAsServer() 
    { 
     if (Listener != null) Listener.Stop(); 
     if (ListenerThread != null) ListenerThread.Join(); 
     Listener = new TcpListener(RemoteAddress, RemotePort); 
     Listener.Start(); 
     Listening = true; 
     ListenerThread = new Thread(ListenForConnections); 
     ListenerThread.Start(); 
    } 

    private void ListenForConnections() 
    { 
     while (Listening) 
     { 
      if (Listener.Pending()) 
       Listener.BeginAcceptTcpClient(HandleIncomingClient, null); 
     } 
    } 

    private void HandleIncomingClient(IAsyncResult ar) 
    { 
     var client = Listener.EndAcceptTcpClient(ar); 
     var thread = new Thread(c => HandleIncomingClientMessage((TcpClient)c)); 
     HandlerThreads.Add(thread); 
     Clients.Add(client); 
     thread.Start(client); 
    } 

連接到該監聽程序:

public void ConnectAsClient() 
    { 
     var client = new TcpClient(); 
     client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
     client.Connect(RemoteAddress, RemotePort); //this line fails 
     Clients.Add(client); 
    } 
+0

您使用哪個端口號? – 2011-05-18 20:42:01

+2

你的應用綁定了什麼地址?如果它正在監聽(使用1234作爲示例)'127.0.0.1:1234',則外部連接將會出現「連接被拒絕」錯誤。它需要收聽機器實際的IP:1234組合,或者聽取所有地址。 – 2011-05-18 20:42:40

+2

您是否嘗試過使用telnet連接遠程計算機?您可以使用命令提示符下的'telnet remoteComputer 29342',其中29342是您嘗試連接的端口。如果您能夠使用telnet進行連接,那麼至少會告訴您問題出在您的客戶端應用程序中。如果您無法使用telnet進行連接,則問題出現在服務器應用程序中,或者(更可能)出現網絡問題(如您不知道的防火牆)。 – FlyingDeveloper 2011-05-18 20:44:33

回答

2

你出演你的聽衆的方式是有點過。您不需要指定地址,只有端口。

+1

只有端口的構造函數在.NET 4.0中被標記爲不建議使用。但是,我會試一試。 – KeithS 2011-05-18 20:51:14

+1

IPAddress類中有一個地址,我認爲是IPAddress.Any。 – 2011-05-18 20:52:26

+1

是的,你需要IPAddress.Any。如果您嘗試使用本地(如127.0.0.1),那麼您可能無法偵聽暴露於Internet的適配器,並且您將看到的行爲是您可以在本地連接到您的計算機上,但無法使用從互聯網上的一臺機器進行連接。 – Triynko 2011-05-18 21:00:19

相關問題