关于udp recvfrom #6
-
有点不太明白udp的recvfrom和接收缓冲区是怎么工作的。。。 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
感谢提问。这是一个非常好的问题。 这是因为udp报文读取时并不是像tcp流一样按给定的length读取bytes,而是一次取出一整个包,然后截取给定的length,如果给定的length比一个包的实际大小小,那么这个包剩下的内容也会丢失(可以通过设置flag避免)。例如,如果一个udp包大小为1400 bytes,用户调用recvfrom(1000),那么这1400bytes会被全部取出,但只返回前1000 bytes,剩下的会丢掉。而如果一个udp包大小为1400,用户调用recvfrom(2000),那么返回的只有1400 bytes,因为一次只会读取一个包。 参考 recvfrom manpage:
注意其中 the entire message shall be read in a single operation 在准备此次project时我们参考的讨论:stack-over-flow-讨论 所以,在发送端给定最大udp包1400的情况下,接收端每次直接将bufsize设置成1400即可,不会出现读到两个包的情况。 如有任何问题,欢迎继续提出。 |
Beta Was this translation helpful? Give feedback.
感谢提问。这是一个非常好的问题。
先说答案:一次recvfrom中不会有第二个包的内容。
这是因为udp报文读取时并不是像tcp流一样按给定的length读取bytes,而是一次取出一整个包,然后截取给定的length,如果给定的length比一个包的实际大小小,那么这个包剩下的内容也会丢失(可以通过设置flag避免)。例如,如果一个udp包大小为1400 bytes,用户调用recvfrom(1000),那么这1400bytes会被全部取出,但只返回前1000 bytes,剩下的会丢掉。而如果一个udp包大小为1400,用户调用recvfrom(2000),那么返回的只有1400 bytes,因为一次只会读取一个包。
参考 recvfrom manpage: