C# UdpCLient.Receive 在不同的机器上没有收到任何数据

C# UdpCLient.Receive doesn't receive any data on different machine

大家好,我正在用 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 工作)。

祝你好运。