Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 接收整个UDP数据报,无论大小?_Sockets_Udp_Posix - Fatal编程技术网

Sockets 接收整个UDP数据报,无论大小?

Sockets 接收整个UDP数据报,无论大小?,sockets,udp,posix,Sockets,Udp,Posix,考虑通过套接字发送100个字节。对于TCP套接字,如果我调用长度为50的recv(),我会得到前50个字节,如果我再次调用它,我会得到后50个字节。对于UDP套接字,如果我调用长度为50的recvfrom(),我会得到前50个字节,但在收到下一个数据报之前,无法检索第二个50字节-随后调用recvfrom()块 这是否意味着,如果我想接收整个UDP数据报,无论大小,我必须分配64k缓冲区(UDP允许的最大值)?如果我connect()我的UDP套接字,这会改变行为吗?或者,在UDP上运行的协议通

考虑通过套接字发送100个字节。对于TCP套接字,如果我调用长度为50的
recv()
,我会得到前50个字节,如果我再次调用它,我会得到后50个字节。对于UDP套接字,如果我调用长度为50的
recvfrom()
,我会得到前50个字节,但在收到下一个数据报之前,无法检索第二个50字节-随后调用
recvfrom()


这是否意味着,如果我想接收整个UDP数据报,无论大小,我必须分配64k缓冲区(UDP允许的最大值)?如果我
connect()
我的UDP套接字,这会改变行为吗?或者,在UDP上运行的协议通常需要一个已知的最大数据包大小,该数据包大小应该用于缓冲区吗?

大多数基于UDP的协议不会通过较少的IP和UDP报头来避免。例如,对于大于512字节的消息,DNS会切换到TCP。因此,使用1472字节的缓冲区(1500以太网MTU-20用于IP报头,不带选项-8 UDP报头)可能是安全的,除非您的网络使用巨型帧。这当然取决于UDP之上的应用程序协议

如果您真的有妄想症(或使用未知协议),您可以使用
MSG_PEEK
MSG_TRUNC
标志来首先确定大小,然后分配足够大的缓冲区(请参阅)