大家好我在c#中使用服务器和大量客户端开发应用程序,我需要他们特别通信,服务器必须向所有客户端发送一个数据包,这在随机时间开始(它发送仅当另一个程序发送我捕获的信号时才发送数据包)。我不想使用TCP,因为这必须尽可能快,因为我有很多客户端(它们可能超过一千)。
我尝试了UDP的一些解决方案,包括广播和多播,还有一个循环将数据包发送到所有这些解决方案。我用1台服务器和2台客户端对它进行了测试,这两种解决方案在同一台机器上工作正常,但当我把它放在互联网上(机器上的服务器和不同网络中另一台机器上的客户端)时,程序没有&# 39;不再工作,客户不会收到任何东西。
发信人:
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;
}
我在发送中使用循环发布了解决方案,但我也尝试使用广播和多播。
如果他们在不同的机器上做什么以及为什么我不接受任何事情的任何建议?
答案 0 :(得分:0)
根据您的解释(它不能仅在另一台计算机上运行)和您的代码,似乎是一个端口转发问题。您可以在此处详细了解:https://en.wikipedia.org/wiki/Port_forwarding
端口转发基本上是将您的外部端口映射到内部地址,因此您的计算机可以与其他网络中的计算机进行通信。
您可以在c#中使用UPnP
库,例如Open.Nat,它支持c#中的端口转发。 (您的路由器应启用端口转发以允许Open.nat工作)。
古德勒克。