大家好,我正在用 C# 开发一个带有服务器和大量客户端的应用程序,我需要它们进行通信,特别是服务器必须向所有客户端发送一个数据包,这种情况发生在随机时间(它仅在另一个数据包时才发送数据包)程序发送一个我捕获的信号)。我不想使用 TCP,因为这必须尽可能快,而且我有很多客户端(可能超过一千个)。
我尝试了一些使用 UDP 的解决方案,包括广播和多播,以及循环将数据包单独发送给所有这些解决方案。我用 1 个服务器和 2 个客户端对其进行了测试,这两种解决方案在同一台计算机上时都可以正常工作,但是当我将其放在互联网上(服务器在一台计算机上,客户端在不同网络中的另一台计算机上)时,程序不会不再工作了,客户没有收到任何东西。
发件人:
private void send(string packet){
/* code to get the key to encript the data */
byte[] bytes = Encryptor.EncryptString(packet, key);
query = "SELECT ip FROM utenti WHERE ID <> 2";
List<string> ips = SelectIPs(query);
foreach (string ip in ips){
if (ip == "")
continue;
UdpClient client = new UdpClient();
IPAddress address = IPAddress.Parse(ip);
IPEndPoint ipEndPoint = new IPEndPoint(address, 16759);
client.Send(bytes, bytes.Length, ipEndPoint);
client.Close();
}
}
接收者:
private void receive(string packet){
receivingUdpClient = new UdpClient(16759);
RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse("185.43.209.118"), 0);
byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
/* code to get the key to decrypt */
string returnData = Encryptor.DecryptString(receiveBytes, key);
Console.WriteLine(returnData);
return;
}
我在发送中发布了带有循环的解决方案,但我也尝试了广播和多播。
对于该怎么做以及为什么我在不同的机器上没有收到任何东西有什么建议吗?
根据您的解释(它不仅仅在另一台机器上工作)和您的代码,这似乎是一个端口转发问题。您可以在这里阅读更多相关信息:https://en.wikipedia.org/wiki/Port_forwarding
端口转发基本上是将您的外部端口映射到内部地址,以便您的计算机可以与其他网络中的计算机进行通信。
您可以使用c#中的
UPnP
库,例如Open.Nat,它支持c#中的端口转发。 (您的路由器应启用端口转发以允许 Open.nat 工作)。
祝你好运。
尝试使用 UdpClient Ttl。例如将其设置为 50。