C 非阻塞UDP写入能否返回比请求的字节更少的字节?

C 非阻塞UDP写入能否返回比请求的字节更少的字节?,c,sockets,udp,C,Sockets,Udp,我有一个应用程序,它通过一条链路将数据点对点从发送方发送到接收方,该链路可以在单工(单向传输)或双工(双向)模式下运行。在单工模式下,应用程序使用UDP发送数据,在双工模式下使用TCP。由于TCP套接字上的写操作可能会阻塞,因此我们使用非阻塞IO(ioctl with FIONBIO-O_NONBLOCK和fcntl在此发行版上不受支持)和select()系统调用来确定何时可以写入数据。使用NIO是为了在网络状况恶化时,如果需要,我们可以在超时后提前中止发送。我希望使用相同的基本代码进行发送,但

我有一个应用程序,它通过一条链路将数据点对点从发送方发送到接收方,该链路可以在单工(单向传输)或双工(双向)模式下运行。在单工模式下,应用程序使用UDP发送数据,在双工模式下使用TCP。由于TCP套接字上的写操作可能会阻塞,因此我们使用非阻塞IO(ioctl with FIONBIO-O_NONBLOCK和fcntl在此发行版上不受支持)和select()系统调用来确定何时可以写入数据。使用NIO是为了在网络状况恶化时,如果需要,我们可以在超时后提前中止发送。我希望使用相同的基本代码进行发送,但在更高的抽象级别上在TCP/UDP之间进行更改。这对TCP非常有效

然而,我关心的是UDP套接字的非阻塞IO是如何工作的。我可能错误地读取了手册页,但由于write()返回的结果可能表明发送的字节数少于请求的字节数,这是否意味着客户端将在其数据报中接收到更少的字节数?要发送给定的数据缓冲区,可能需要多次写入,因为我使用的是非阻塞IO。我担心这将转换为客户端接收的多个UDP数据报

我对socket编程相当陌生,所以如果我在这里有一些误解,请原谅我。谢谢。

假设UDP实现正确(未中断),则每个send/sendmsg/sendto将对应于发送的完整数据报,每个recv/recvmsg/recvfrom将对应于接收的完整数据报

如果无法完整传输UDP消息,则应收到
EMSGSIZE
错误。由于网络中某个点的大小,发送的消息仍可能失败,在这种情况下,它将无法到达。但它不会以碎片形式交付(除非IP堆栈存在严重缺陷)


一个好的经验法则是将UDP负载大小保持在最多1400字节。这是非常近似的,为各种形式的隧道留出了很大的空间,以避免碎片化。

您可能需要检查正在使用的任何系统的详细信息;您的UDP堆栈可能有特定的限制(确实有,正如您已经说过的)。谢谢。我又做了一些测试,发现我的整个有效负载或者没有一个有效负载被发送给使用UDP的给定write()调用——这是唯一合乎逻辑的事情。我在VxWorks 5.5上使用供应商提供的堆栈来支持TOE。。。在目标平台上没有看到EMSGSIZE,我并不感到惊讶。无论如何,谢谢你的权威回复,这绝对有助于让我相信我已经涵盖了这些基础。