Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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
应用程序级协议设计中recvfrom()的混淆_C_Protocols - Fatal编程技术网

应用程序级协议设计中recvfrom()的混淆

应用程序级协议设计中recvfrom()的混淆,c,protocols,C,Protocols,假设使用Linux和UDP recvfrom的报告说: receive calls(接收呼叫)通常返回所有可用数据,最多返回请求的金额,而不是等待收到请求的全部金额 如果是这种情况,则很可能从套接字返回部分应用程序级协议数据,即使设置了所需的MAX_SIZE 是否应随后调用recvfrom 从另一个意义上讲,它也可能有比我想要的更多的数据,例如套接字缓冲区中的两个UDP数据包。如果在本例中调用了recvfrom(),它会同时返回这两个值吗(假设在MAX\u SIZE中) 我想在每个UDP消息的开

假设使用Linux和UDP

recvfrom的报告说:

receive calls(接收呼叫)通常返回所有可用数据,最多返回请求的金额,而不是等待收到请求的全部金额

如果是这种情况,则很可能从套接字返回部分应用程序级协议数据,即使设置了所需的
MAX_SIZE

是否应随后调用
recvfrom

从另一个意义上讲,它也可能有比我想要的更多的数据,例如套接字缓冲区中的两个UDP数据包。如果在本例中调用了
recvfrom()
,它会同时返回这两个值吗(假设在
MAX\u SIZE
中)


我想在每个UDP消息的开头应该有一些应用程序协议级别的大小信息,这样它就不会出错。

我想您想要的手册页是。它声明将丢弃额外的数据。如果有两个数据包,recvfrom调用将只从第一个数据包中检索数据。

嗯..在搜索web后,我得到了一个更好的答案:

在读取时,不要害怕使用大缓冲区和指定大数据报大小
recv()
仅读取一个数据报,即使接收缓冲区中有许多数据报,并且它们都适合您的缓冲区。。。请记住,UDP是面向数据报的,所有操作都在这些数据包上,而不是字节上

如果使用TCP套接字,将面临不同的场景TCP没有任何边界“概念”,因此您只需读取所需的字节数,
recv()
将返回一个等于
MIN的字节数(缓冲区中的字节数,您的调用请求的字节数)


REF:

那么接下来的recvfrom()调用呢?它会得到第一个留下的缓冲区中已经存在的第二个吗?@Figo:是的,它一次返回一个。