2011-05-18 373 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

相关问题