应用程序之间的UDP/IP交流



我正在使用一个使用UDP/IP通信来互相发送数据的应用程序。但是现在它正在使用广播。

    private void InitializeSender()
    {
        sendingClient = new UdpClient();
        sendingClient = new UdpClient(broadcastAddr, port);
        sendingClient.EnableBroadcast = true;
    }
    public void Sender(string message)
    {
         if (!string.IsNullOrEmpty(message))
         {
                string toSend = yourUsername+":"+message;
                byte[] data = Encoding.ASCII.GetBytes(toSend);
                sendingClient.Send(data, data.Length);
          }
     }

我想将其切换为专用发送。我有一个List<Dictionary<string, IPEndPoint>> user_ip = new List<Dictionary<string, IPEndPoint>>();,可以在其中存储用户名和IP组合。但是我不知道如何从另一个应用程序中获取这些数据。如何将用户名/IP信息发送给其他客户端。我应该有广播发现或类似的东西吗?您知道这有什么好的解决方案吗?

最简单,最耐用的解决方案:

  1. 启动应用程序在用户名端口A上听。内部用户名的每条传入消息都将与发件人的IP一起放入user_ip字典中(除外,OFC除外(。
  2. 它在整个网络上在同一端口A上广播了自己的用户名。此步骤允许其他已经开始记住该新客户端的IP的实例(因为他们已经在听端口A(。
  3. 它开始以自己的用户名来回答每个传入的用户名,并继续将它们放入user_ip中。在关闭应用程序之前,不要停止此行为。这就是为什么在步骤2应用程序之后将收到(希望(同一网络上的客户端的完整列表。

此解决方案有两个主要问题:

  1. UDP不能确保传递消息,这使整个产品都不可靠。
  2. 这种方法在整个互联网上不起作用。为了克服此限制,您需要一台可达的服务器,这将负责同步。结合TCP,这也将消除第一个问题。

upd:关于选择TCP与UDP的问题。

TCP提供可靠性,UDP被认为更快(在某些情况下更快(。因此,正确的选择取决于。

还请记住,TCP不允许您进行广播。实际上,这意味着对于TCP,您基本上将有两种选择:

  1. 有服务器
  2. 或使用UDP进行同行发现,然后使用TCP传输实际数据。

后者的第一步仍然缺乏可靠性。但是,这个缺陷可能可以通过定期重复步骤2绕过。可以说每5分钟一次,这适合大多数应用程序。

您可以看到,有很多东西(实际上,比我在这里提到的更多(可能是可能的,而且选择在很大程度上取决于实际任务。很难说出哪种方式,因为您没有描述任何要求。

就个人而言,当我不受限制时,我更喜欢采取灵活性路径并选择"客户端服务器"体系结构,因为需求总是可以改变。当客户说"我需要在互联网上工作"时,我已经在那里:)但是这个决定仍然在很大程度上取决于实际任务。

最新更新