Sockets 读取UDP套接字:记录还是流
假设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%正确的接收器代码,我应该实现某种流解析逻辑,还是数据记录读取逻辑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套接字是不正确的。一个从UDP套接字读取的数据报退出队列一个无论队列中有多少数据报(例外是新的Linux特定的
recvmmsg(2)
API),也就是说,假设数据包没有被重新排序,并且您给内核的缓冲区足够大,那么您将在三次读取中获得100、200和300字节
UDP应用程序通常是面向记录的。还假设没有丢弃任何数据包。