假设UDP发送方多次执行sendto:
<>之前Sendto (s, buffer, 100,…);Sendto (s, buffer, 200,…);Sendto (s, buffer, 300,…);之前当数据可用时,接收器执行以下代码:
<>之前空白OnReceive (){Recvfrom (s, buffer, 1000,…);}之前现在,如果在调用recvfrom时所有数据(100+200+300)都是可用的,那么它是否可能被一个recvfrom调用读取,或者被几个大小不可预测的recvfrom调用读取?还是会一直按发送时的相同比例收到:100,200,300 ?
要写100%正确的接收器代码,我应该实现某种流解析逻辑,还是数据记录读取逻辑?
对于这个问题,我假设数据没有丢失,数据包的顺序没有改变,但是,在一般情况下,这对于UDP套接字是不正确的。
从UDP套接字读取一个数据报,无论队列中有多少(新的linux特定的recvmmsg(2)
API例外),即假设数据包没有重新排序并且您给内核的缓冲区足够大,您将在三次读取中获得100,200和300字节。
UDP应用通常是面向记录的