我有一個簡單的程序,我正在開發該程序,以在我的公司在客戶端控制的遠程計算機上執行一些帶寬測試。該程序的一個副本在遠程計算機上,並被告知在指定的端口上進行偵聽。然後告知同一程序的另一個副本連接到監聽計算機,然後發送帶有已知長度消息的隨機內容的序列化對象。傳輸是定時的,並將結果發送回原始機器。程序正在偵聽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);
}
您使用哪個端口號? – 2011-05-18 20:42:01
你的應用綁定了什麼地址?如果它正在監聽(使用1234作爲示例)'127.0.0.1:1234',則外部連接將會出現「連接被拒絕」錯誤。它需要收聽機器實際的IP:1234組合,或者聽取所有地址。 – 2011-05-18 20:42:40
您是否嘗試過使用telnet連接遠程計算機?您可以使用命令提示符下的'telnet remoteComputer 29342',其中29342是您嘗試連接的端口。如果您能夠使用telnet進行連接,那麼至少會告訴您問題出在您的客戶端應用程序中。如果您無法使用telnet進行連接,則問題出現在服務器應用程序中,或者(更可能)出現網絡問題(如您不知道的防火牆)。 – FlyingDeveloper 2011-05-18 20:44:33