【问题标题】:UDP/IP Communation between apps应用程序之间的 UDP/IP 通信
【发布时间】:2018-02-10 09:34:17
【问题描述】:

我正在开发一个使用 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 信息发送到其他客户端。我应该有广播发现或类似的东西吗?你知道有什么好的解决方案吗?

【问题讨论】:

  • 你的应用没有使用 TCP/IP,它使用的是 UDP/IP...
  • 是的,只是打错字了

标签: c# networking udpclient


【解决方案1】:

最简单最省事的解决方案:

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

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

  1. UDP 不保证消息被传递,这使得整个产品不可靠。
  2. 此方法不适用于 Internet。为了克服这个限制,您需要一个可访问的服务器来处理同步。结合 TCP,这也将消除第一个问题。

统一更新: 关于选择 TCP 还是 UDP 的问题。

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

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

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

后一种选择在第一步仍然缺乏可靠性。但是这个缺陷可能可以通过定期重复第 2 步来绕过。假设每 5 分钟一次,这应该适合大多数应用程序。

如您所见,有很多(真的,比我在这里提到的更多)可能性,而且选择在很大程度上取决于实际任务。由于您没有描述任何要求,因此很难判断您应该走哪条路。

在不受限制的情况下,我个人更喜欢走一条灵活的道路并选择“客户端-服务器”架构,因为需求总是可以改变的。当客户说“我需要这个在互联网上工作”时,我已经在那里了:) 但是这个决定仍然很大程度上取决于实际任务。

【讨论】:

  • 那我应该使用TCP协议吗?是的,我还不想在 Internet 上工作。如果我愿意,我会使用服务器。
  • @SzabolcsMészáros 更新了我的答案以解决这一点:) 希望这会有所帮助。
猜你喜欢
  • 2011-10-26
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多