gpt4 book ai didi

非阻塞 UDP 写入返回的字节数能否少于请求的字节数?

转载 作者:太空狗 更新时间:2023-10-29 17:25:49 24 4
gpt4 key购买 nike

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

但是我担心非阻塞 IO 如何用于 UDP 套接字。我可能没有正确阅读手册页,但由于 write() 可能返回指示发送的字节数少于请求的字节数,这是否意味着客户端将在其数据报中接收到更少的字节数?要发送给定的数据缓冲区,可能需要多次写入,这可能是因为我使用的是非阻塞 IO。我担心这会转化为客户端接收的多个 UDP 数据报。

我是套接字编程的新手,所以如果这里有一些误解,请原谅我。谢谢。

最佳答案

假设一个正确的(未损坏的)UDP 实现,那么每个 send/sendmsg/sendto 将对应于一个完整的数据报发送,每个 recv/recvmsg/recvfrom 将对应于一个完整的数据报接收。

如果 UDP 消息无法完整传输,您应该会收到一个 EMSGSIZE 错误。由于网络中某个点的大小,发送的消息可能仍会失败,在这种情况下,它根本不会到达。但它不会分段交付(除非 IP 栈有严重错误)。

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

关于非阻塞 UDP 写入返回的字节数能否少于请求的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10309520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com