我有一个应用程序通过 UDP 以某种已知格式发送消息。我想知道这些消息的发送速率。明确地说,我不太关心数据速率 - 这是一个环回,所以它接近无穷大 + 1 - 我需要知道它的频率完整的消息出去。
答案1
答案2
如果您所说的“消息”是指“数据报”,那么答案是 100%。UDP 数据报要么被发送,要么不发送,要么到达,要么不到达。您永远不应该recvfrom()
只发送 UDP 数据报的一部分。如果数据报最终大于网络 MTU,它可能会在 IP 层被分段,但任何丢弃的片段都会导致整个数据报被丢弃,而不是部分消息。
回送速度不是无限的:它受 CPU 限制。如果您发送数据太快,则传出的 UDP 缓冲区将填满。然后,当您尝试发送一个sendto()
太大而无法放入剩余缓冲区空间的数据报时,您将收到错误,如EAGAIN
、ENOBUFS
或EMSGSIZE
,具体取决于实现。如果接收方调用recvfrom()
速度太慢,则其传入缓冲区将填满,数据报将被默默丢弃。
一个更相关的问题是实际收到的发送数据报的百分比。在远低于 CPU 饱和度的速率下,环回时该百分比应为 100%。但是当接近 CPU 饱和度时,或者如果接收方读取数据报的速度很慢,该百分比可能会变得非常低。