【问题标题】:Multiple UDP messages sent to single reveiver多个 UDP 消息发送到单个接收器
【发布时间】:2012-04-25 19:57:27
【问题描述】:

情况如下: 我有多个客户端和一个主机。指定消息格式和大小。 假设所有客户端同时发送一条消息,即向主机发送N条消息。

我的问题是:主机会收到一条混合消息吗,我的意思是主机会收到一些消息 A,然后是来自消息 B 的一些位吗?或者消息将被全部接收?

谢谢

【问题讨论】:

  • 都尝试在同一个端口上发送?
  • 是的,所有客户端都发送到主机上的同一个端口。在我的程序中,服务器部分只有一个 udp 套接字。
  • 那么我不相信你会遇到他们同时发送的情况。我相信一旦一个客户端打开了与端口的连接,在它关闭之前其他客户端都无法这样做。
  • TCP 的限制是,一旦打开,对等套接字只能包含来自 5 元组中命名的两方的数据(ip1、port1、TCP、port2、ip2 )。可以创建 UDP 套接字来接受从任何源(即源端口和源 IP 地址)发送给它的数据报(即,到指定的目标端口和 IP 地址)。

标签: c++ networking udp


【解决方案1】:

UDP 数据报总是作为一个完整的数据报被“终端客户端”接收。也就是说,如果发送者发送一个 10,000 字节的数据报,它将被接收为 10,000 字节(而不是一些较小的数据报的组合,加起来为 10,000 字节)。数据报所采用的路径(即IP)可能会导致数据报在传输过程中被分片,但接收的UDP/IP栈会在传递给应用程序之前重新组装数据报。

【讨论】:

  • 不,需要有序传送的应用程序必须自己恢复数据报的顺序。
  • 是的,整个数据报可能会“乱序”传递到端点。我的回答是关于单个数据报的片段,而不是多个数据报。
【解决方案2】:

当您从套接字读取数据(例如,使用recvfrom)时,从该调用返回的所有数据都将来自单一来源。

【讨论】:

  • 不同应用程序发送的数据报不会在接收应用程序处混合(假设底层堆栈行为正确,就像通用操作系统中的堆栈一样)。
  • @ArtSwri:从实际的角度来看,您是正确的。重新组装不正确发生肯定是不太可能的情况。但是,我很确定我已经观察到没有导致重新组装的碎片案例。多年来,我不得不在许多粗略的网络情况下处理 UDP 问题。
  • " 我相信一旦一个客户端打开了到端口的连接,在它关闭之前其他客户端都不能这样做。" 如果两个客户端向主机发送消息,主机可以处理一个一次味精,主机只是转储另一个味精还是被缓冲?
  • 这个答案不正确。如果数据报被分片并且丢失了一个片段,则整个数据报都会丢失,因为没有重传机制。这意味着 UDP 数据报被完整接收或根本不被接收。数据被“混合”的可能性为零。
  • @Mark Wilkins 我在挖掘堆栈代码方面有相当多的经验。对于 PC 或更大的设备,堆栈是完整且成熟的,将交付整个数据报或将其丢弃(例如,如果由于缺少段而重新组装失败)。对于小型设备,我已经看到堆栈实现的质量有相当大的差异,甚至极差/有限的重新组装(或根本没有)。还没有看到任何(还)提供数据报的部分/片段。
猜你喜欢
  • 2012-06-05
  • 2015-03-28
  • 2023-04-03
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
相关资源
最近更新 更多