C++ 发送到单个reveiver的多个UDP消息

C++ 发送到单个reveiver的多个UDP消息,c++,networking,udp,C++,Networking,Udp,情况如下: 我有多个客户端和一个主机。已指定消息格式和大小。 假设所有客户端同时发送一条消息,即N条消息被发送到主机 我的问题是:主机是否会收到一条混合消息,我的意思是主机是否会收到消息a的一些位,然后是消息B的一些位?或者这些信息将全部接收 感谢您从套接字读取数据(例如,使用recvfrom)时,从该调用返回的所有数据都将来自单个源。UDP数据报始终作为整个数据报由“终端客户端”接收。也就是说,如果发送方发送10000字节的数据报,它将作为10000字节接收(而不是加起来10000字节的较小数

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

我的问题是:主机是否会收到一条混合消息,我的意思是主机是否会收到消息a的一些位,然后是消息B的一些位?或者这些信息将全部接收


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

UDP数据报始终作为整个数据报由“终端客户端”接收。也就是说,如果发送方发送10000字节的数据报,它将作为10000字节接收(而不是加起来10000字节的较小数据报的组合)。数据报(即IP)所采用的路径可能会导致数据报在传输过程中出现碎片,但接收UDP/IP堆栈会在将数据报发送到应用程序之前重新组装数据报。

所有客户端都试图在同一端口上发送?是的,所有客户端都发送到主机上的同一端口。在我的程序中,我的服务器部分只有一个udp套接字。那么,我不相信你会遇到这样的情况:它们同时发送。我相信,一旦一个客户端打开了到该端口的连接,其他客户端将无法这样做,直到它关闭。TCP有一个限制,即一旦打开,对等套接字只能包含来自5元组中命名的两方(ip1、port1、TCP、port2、ip2)的数据。可以创建UDP套接字来接受从任何源(即源端口和源ip地址)发送到它的数据报(即,发送到指定的目标端口和ip地址)。不同应用程序发送的数据报不会在接收应用程序中混合(假设底层堆栈的行为正确,就像通用操作系统中的堆栈一样)@ArtSwri:从实际的角度来看,你是正确的。重组不太可能发生。但是,我非常确定,我观察到碎片的情况并没有导致重组。多年来,我不得不在许多粗略的网络情况下处理UDP问题。“我相信,一旦一个客户机打开了与该端口的连接,在它关闭之前,其他客户机将无法这样做。"如果两个客户机向主机发送消息,主机一次可以处理一个消息,主机是否会转储另一个消息,或者它将被缓冲?这个答案是不正确的。如果数据报碎片化,一个碎片丢失,整个数据报将丢失,因为没有重传机制。这意味着UDP数据报将被完整接收,或者根本没有接收到。Th数据“混合”的可能性为零。@Mark Wilkins我有相当多的挖掘堆栈代码的经验。对于PC或更大的设备,堆栈是完整和成熟的,要么交付整个数据报,要么丢弃它(例如,如果由于缺少段而重新组装失败).对于小型设备,我已经看到堆栈实现的质量有相当多的变化,包括极差/有限的重新组装(或根本没有)。还没有看到任何变化(尚未)交付数据报的部分/片段。不,需要有序交付的应用程序必须恢复数据报的顺序。是的,整个数据报可能会“无序”交付到端点。我的答案是单个数据报的片段,而不是多个数据报。