实时操作系统上的UDP非阻塞套接字:sendto()和recvfrom()可以返回部分消息吗?

时间:2013-01-14 14:46:39

标签: sockets udp real-time recv sendto

这是我的第一条消息。 我正在使用实时操作系统(OnTime和VxWorks)上的非阻塞UDP套接字。 我已经阅读了文档和一些论坛,但我对sendto()和recvfrom()函数的“原子性”有一些疑问:

  • sendto()返回入队或错误的字节数。它是否可能小于输入缓冲区长度?也许输出缓冲区没有足够的可用空间,只有几个字节排队......

  • recvfrom()返回接收的字节数或错误。它是否可能小于源发送的消息的大小?我是指部分留言阅读...

我希望读写函数是原子的(完整消息或没有消息读/写)。

感谢。 Emanuele的。


我问OnTime支持他们告诉我,如果输出缓冲区没有足够的可用空间,sendto()可能会将部分消息排入队列。我不知道在某些情况下recvfrom()是否也会返回部分消息。我想在不同操作系统中的套接字实现上没有标准行为。

2 个答案:

答案 0 :(得分:1)

  

sendto()返回入队或错误的字节数。可能吗   它是否小于输入缓冲区长度?

没有。它全部发送,或根本不发送UDP。

  

recvfrom()返回接收的字节数或错误。是吗   它可能少于源发送的消息的大小?   我的意思是部分消息阅读...

如果OS堆栈的缓冲区无法容纳整个UDP数据包,则会将其丢弃。如果您的应用程序缓冲区无法容纳整个数据包,则会获得数据包的初始内容。

即。你只能在一种情况下读取部分消息,即数据不能适合你传递给sendto()的缓冲区。在那种情况下,数据包的其余部分将被丢弃。使用recvmsg(),您可以检测数据包是否被截断,但这通常通过使用最大大小的缓冲区(UDP必须适合MTU为2 ^ 16-1的IP数据包)或通过设计您使用的协议来解决在UDP中你可以设置自己合理的最大尺寸。

答案 1 :(得分:0)

我对这些系统并不是很熟悉,但如果它们破坏了正常的UDP套接字语义,我将会非常惊讶,这种语义总是将“完整数据报”排入“发送”并在“接收”上将完整的单个数据报出列”