Sockets 实时操作系统上的UDP非阻塞套接字:sendto()和recvfrom()可以返回部分消息吗?
这是我在这里的第一条信息。 我正在使用实时操作系统(OnTime和VxWorks)上的非阻塞UDP套接字。 我已经阅读了文档和一些论坛,但对sendto()和recvfrom()函数的“原子性”有一些疑问:Sockets 实时操作系统上的UDP非阻塞套接字:sendto()和recvfrom()可以返回部分消息吗?,sockets,udp,real-time,recv,sendto,Sockets,Udp,Real Time,Recv,Sendto,这是我在这里的第一条信息。 我正在使用实时操作系统(OnTime和VxWorks)上的非阻塞UDP套接字。 我已经阅读了文档和一些论坛,但对sendto()和recvfrom()函数的“原子性”有一些疑问: sendto()返回排队或出错的字节数。是否可能小于输入缓冲区长度?可能输出缓冲区没有足够的可用空间,只有几个字节排队 recvfrom()返回接收到的字节数或错误。它是否可能小于源发送的消息的大小?我的意思是部分信息阅读 我希望读写功能是原子的(完整消息或无消息读写) 谢谢。 伊曼纽尔
- sendto()返回排队或出错的字节数。是否可能小于输入缓冲区长度?可能输出缓冲区没有足够的可用空间,只有几个字节排队
- recvfrom()返回接收到的字节数或错误。它是否可能小于源发送的消息的大小?我的意思是部分信息阅读
我请求OnTime支持,他们告诉我,如果输出缓冲区没有足够的可用空间,sendto()可能会将部分消息排入队列。我不知道recvfrom()在某些情况下是否也可以返回部分消息。我认为不同操作系统之间的套接字实现没有标准行为 sendto()返回排队或出错的字节数。可能吗 它小于输入缓冲区的长度 不,它是完全发送的,或者根本不发送UDP recvfrom()返回接收到的字节数或错误。它是 是否可能小于源发送的消息的大小? 我的意思是部分信息阅读 如果操作系统堆栈的缓冲区不能容纳整个UDP数据包,则会丢弃该数据包。如果您的应用程序缓冲区不能容纳整个数据包,那么您将获得数据包的初始内容
i、 e.您可以在一种情况下读取部分消息,即数据无法放入传递给sendto()的缓冲区。在这种情况下,数据包的其余部分将被丢弃。使用recvmsg()可以检测数据包是否被截断,但这通常可以通过使用最大大小的缓冲区(UDP必须适合MTU为2^16-1的IP数据包)或通过设计UDP内部使用的协议来解决,您可以在其中设置自己合理的最大大小。我对这些系统不是很熟悉,但如果他们破坏了正常的UDP套接字语义,我会非常惊讶,通常是在“发送”时将完整的数据报排队,在“接收”时将完整的单个数据报排队。只有使用.Steve,AFAIK,UDP Lite才是部分校验和。您能给我指出一些关于部分有效负载的参考吗?我向OnTime支持部门询问,他们告诉我,如果输出缓冲区没有足够的可用空间,sendto()可能会将部分消息排入队列。我不知道recvfrom()在某些情况下是否也可以返回部分消息。我假设不同操作系统之间的套接字实现没有标准行为。当被要求提供OnTime支持时,他们告诉我,如果输出缓冲区没有足够的可用空间,sendto()可能会将部分消息排入队列。我不知道recvfrom()在某些情况下是否也可以返回部分消息。我认为不同操作系统之间的套接字实现没有标准行为。