无法向远程计算机发送消息

时间:2014-03-16 12:08:07

标签: c# .net udp chat

我试图让UDP客户端和UDP服务器在两台远程计算机之间通过Internet发送消息。

服务器代码是:

public class Server {

    private static void Main(string[] args) {
        var t = new Thread(new ThreadStart(Listen));
        t.Start();
    }

    private static void Listen() {
        UdpClient server = new UdpClient(5035);

        while(true) {
            IPEndPoint client = null;
            Console.WriteLine("Waiting for a message...");

            // listening
            byte[] data = server.Receive(ref client);
            Console.WriteLine("Message received from {0}:{1}.", client.Address, client.Port);

            string message = Encoding.Default.GetString(data);
            Console.WriteLine("-> {0}\n", message);
        }
    }
}

客户端代码是:

public class Client {

    private static void Main(string[] args) {
        while(true) {
            Console.Write("\nEnter a message : ");
            string message = Console.ReadLine();

            // serialization
            byte[] msg = Encoding.Default.GetBytes(message);

            // sending
            UdpClient udpClient = new UdpClient();
            udpClient.Send(msg, msg.Length, "127.0.0.1", 5035);
            udpClient.Close();
        }
    }
}

如果我在同一网络上运行服务器和客户端,或者在同一台计算机上运行两者,则一切正常。当客户端和服务器位于两个远程网络上时,会出现此问题。

为了尝试这个,我将客户端代码发送给朋友,我给了他我的网箱IP地址,我的框接收所有消息,但不是我,唯一的方法使它工作,它是添加内部NAT框规则: 我说我的盒子将端口5035上的所有消息重定向到同一端口上的计算机,现在可以正常工作

但我不想这样使用。有没有解决方案在两个远程网络上的两台远程机器之间发送UDP消息,通过Internet而不添加内部NAT盒规则? (也许使用子网掩码?)

1 个答案:

答案 0 :(得分:1)

您需要路由器上的NAT规则。

消费者路由器默认阻止所有传入流量,就像基本防火墙一样。 安装NAT规则将打开路由器上的端口,并通过Internet授予该端口的访问权限。

保护远程位置被认为是一种很好的做法。 在开发网络应用程序时,您需要考虑防火墙。 互联网是一个“邪恶”的环境,没有任何安全保障的开放网络是黑客的梦想。