繁体   English   中英

UDP recv / recvfrom多个发件人

[英]UDP recv/recvfrom multiple senders

美好的一天,

我正在用VC ++开发一个应用程序,它在Windows XP上使用UDP协议和winsock进行通信。 以前我已经能够假设该工具接收的所有数据包都来自单个目标。 但是我现在正在接收广播。 监听线程的开销很小,应该将所有时间都花在下面的行上:

rv = recvfrom(socket, 
              p_buffer_p, 
              p_size,
              0,
              (sockaddr*)&clientService_in, //This is set to do a broadcast recv
              &SenderAddrSize);

我的问题是我是否可以假设我从recvfrom返回的缓冲区来自单个目标。 也就是说,发送应用程序中的1个调用发送应用程序等于从接收应用程序中的recvfrom返回1? 或者多个发件人的多个发送可以合并为1?

我假设来自目标的单个发送不能从recvfrom分成多个返回。 我一直都是这样,从来没有遇到任何问题。

还有一件事,它是一个SOCK_DGRAM类型的套接字。

不,UDP消息不能拆分。 他们在被送出时到达。 此外,不会连接多个UDP消息。

所以N sendto消息对应于N recvfrom呼叫。

来自wiki的引用:

数据报 - 数据包是单独发送的,只有在到达时才会检查其完整性。 数据包具有明确的边界,这些边界在接收时受到尊重,这意味着接收器插槽上的读取操作将产生最初发送的整个消息。

你是正确的,对recvfrom()的单次调用最多只返回一个UDP数据报。 但不能保证每个数据报都会实际到达。

特别是,如果您发送的UDP数据报太大,它可能会在网络级别(碎片)被分割成碎片,这会增加数据报被丢弃的可能性(因为任何碎片的丢失都会导致丢失整个数据报) )。 您没有在应用程序级别看到碎片,因为网络级别会为您重新组装数据包。

事情可能变得非常棘手,因为事先无法确切地知道有多大。 有各种各样的算法可供查找,但它们都相当于试验和错误。 更糟糕的是,防火墙,路由器和操作系统可以(并且通常会)随着时间的推移改变其对碎片数据报的行为。 可能存在这样的情况:特定大小或组合的数据包将始终被丢弃,因为它违反了某些防火墙规则。

因此,永远不要假设sendto()必然会产生recvfrom(),并尝试保持数据报很小(小于1400字节是相当安全的,小于512字节是非常安全的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM