我试图让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盒规则? (也许使用子网掩码?)
答案 0 :(得分:1)
您需要路由器上的NAT规则。
消费者路由器默认阻止所有传入流量,就像基本防火墙一样。 安装NAT规则将打开路由器上的端口,并通过Internet授予该端口的访问权限。
保护远程位置被认为是一种很好的做法。 在开发网络应用程序时,您需要考虑防火墙。 互联网是一个“邪恶”的环境,没有任何安全保障的开放网络是黑客的梦想。