C# 程序正在TCP端口上侦听,但到该端口的连接被拒绝

C# 程序正在TCP端口上侦听,但到该端口的连接被拒绝,c#,tcp,listener,C#,Tcp,Listener,我正在开发一个简单的程序,在我公司控制的客户站点的远程计算机上执行一些带宽测试。程序的一个副本放在远程计算机上,并被告知在指定端口上侦听。然后,同一程序的另一个副本被告知连接到侦听计算机,然后发送一个带有已知长度、随机内容的消息的序列化对象。传输是定时的,并将结果发送回原始计算机 它在环回接口上工作良好;程序的两个副本正在运行,一个监听部件,另一个连接到同一端口(以共享方式)并发送数据。但是,当我将此测试的“远程”端移动到同一内联网上的另一台测试机器上时,即使程序说它正在“侦听”其连接,我的开发

我正在开发一个简单的程序,在我公司控制的客户站点的远程计算机上执行一些带宽测试。程序的一个副本放在远程计算机上,并被告知在指定端口上侦听。然后,同一程序的另一个副本被告知连接到侦听计算机,然后发送一个带有已知长度、随机内容的消息的序列化对象。传输是定时的,并将结果发送回原始计算机

它在环回接口上工作良好;程序的两个副本正在运行,一个监听部件,另一个连接到同一端口(以共享方式)并发送数据。但是,当我将此测试的“远程”端移动到同一内联网上的另一台测试机器上时,即使程序说它正在“侦听”其连接,我的开发机器上的程序也无法连接端口。我得到一个标准错误“由于目标机器主动拒绝,无法建立连接”

这两台计算机之间没有活动防火墙,包括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);
    }

你给听众配角的方式有点不对劲。您不需要指定地址,只需指定端口。

您使用的是哪个端口号?您的应用程序绑定到哪个地址?如果它正在侦听(例如使用1234)
127.0.0.1:1234
,则外部连接将收到“拒绝连接”错误。它需要侦听计算机的实际IP:1234组合,或者侦听所有地址。您是否尝试使用telnet连接到远程计算机?您可以在命令提示符下使用
telnet远程计算机29342
,其中29342是您尝试连接的端口。如果你能连接到telnet,那至少会告诉你问题出在你的客户端应用程序上。如果您无法连接到telnet,则问题可能出在您的服务器应用程序中,或者(更有可能)是网络问题(如您不知道的防火墙)。我支持telnet的建议。Telnet是使用divide and conquer解决此类问题的工具。在.NET 4.0中,只有端口的构造函数被标记为已弃用。但是,我会尝试一下。在IPAddress类中有一个地址,我想,那就是IPAddress.Any。是的,你需要IPAddress.Any。如果您尝试使用local,比如127.0.0.1,那么您可能没有监听暴露在internet上的适配器,您将看到的行为是您可以在您的计算机上本地连接,但无法从internet上的计算机进行连接。嗯,它起到了作用。我认为这与在提到本地计算机时试图使用环回地址有关;实际上,告诉程序自己算出IP地址是一种魅力。