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_Stream_Udp_Datagram - Fatal编程技术网

Sockets 读取UDP套接字:记录还是流

Sockets 读取UDP套接字:记录还是流,sockets,stream,udp,datagram,Sockets,Stream,Udp,Datagram,假设UDP发送方多次执行sendto: sendto(s, buffer, 100, ...); sendto(s, buffer, 200, ...); sendto(s, buffer, 300, ...); 发送到(s,缓冲区,100,…); 发送到(s,缓冲区,200,…); 发送到(s,缓冲器,300,…); 当数据可用时,接收器执行以下代码: void OnReceive() { recvfrom(s, buffer, 1000, ...); } void OnReceive

假设UDP发送方多次执行sendto:

sendto(s, buffer, 100, ...); sendto(s, buffer, 200, ...); sendto(s, buffer, 300, ...); 发送到(s,缓冲区,100,…); 发送到(s,缓冲区,200,…); 发送到(s,缓冲器,300,…); 当数据可用时,接收器执行以下代码:

void OnReceive() { recvfrom(s, buffer, 1000, ...); } void OnReceive() { recvfrom(s,缓冲器,1000,…); } 现在,如果调用recvfrom时所有数据(100+200+300)都可用,是否可能由一个recvfrom调用读取,或者由几个大小不可预测的recvfrom调用读取?或者它总是以发送时的相同部分接收:100200300

要编写100%正确的接收器代码,我应该实现某种流解析逻辑,还是数据记录读取逻辑


对于这个问题,我假设数据没有丢失,数据包顺序也没有改变,但在一般情况下,这对于UDP套接字是不正确的。

一个从UDP套接字读取的数据报退出队列一个无论队列中有多少数据报(例外是新的Linux特定的
recvmmsg(2)
API),也就是说,假设数据包没有被重新排序,并且您给内核的缓冲区足够大,那么您将在三次读取中获得100、200和300字节


UDP应用程序通常是面向记录的。

还假设没有丢弃任何数据包。