从插座部分读取

我有一个测试程序,在客户端> server->客户端(ping /乒乓测试)之间发送大量udp数据包.每次运行时,数据包是固定大小(最后一次运行是udp数据包的最大允许大小)我正在填充包含随机数据的数据包,除了包含数据包数的每个数据包的开头.所以我只想看看我是否收到客户端上的所有数据包.

我使用sendto()和recvfrom(),我只读取sizeof(packet_number)(在这种情况下是一个int).剩下的数据会怎么样?它会结束在仙境(被丢弃)吗?或者到达的新数据包是否附加到这个“旧”数据?

(使用linux)

最佳答案
每个从UDP套接字读取都可以将内核套接字缓冲区中的一个数据报取消排队,无论用户空间缓冲区大小是多少.那是:

>如果您的缓冲区大于下一个待处理的数据报,那么您的缓冲区大小会少一些.
>如果您的缓冲区较小,您将读取您的缓冲区大小值,其余的数据将被丢弃.
>您可以在标志中设置MSG_TRUNC选项,因此recv(2)将返回整个数据报长度,而不仅仅是您读入用户空间缓冲区的部分.

希望这可以帮助.

转载注明原文:从插座部分读取 - 代码日志