我有一个应用程序,它通过可以在单工(单向传输)或双工模式(双向)下运行的链接从发送者到接收者点对点发送数据。在单工模式下,应用程序使用 UDP 发送数据,而在双工模式下,它使用 TCP。由于 TCP 套接字上的写入可能会阻塞,因此我们使用非阻塞 IO(带有 FIONBIO 的 ioctl - 此发行版不支持 O_NONBLOCK 和 fcntl)和 select() 系统调用来确定何时可以写入数据。使用 NIO 是为了在网络状况恶化时,如果需要,我们可以在超时后提前中止发送。我想使用相同的基本代码进行发送,而是在更高抽象的 TCP/UDP 之间进行更改。这对 TCP 非常有用。
但是我担心非阻塞 IO 如何用于 UDP 套接字。我可能错误地阅读了手册页,但是由于 write() 可能返回指示发送的字节数少于请求的字节数,这是否意味着客户端将在其数据报中接收到更少的字节数?要发送给定的数据缓冲区,可能需要多次写入,这可能是因为我使用的是非阻塞 IO。我担心这会转化为客户端收到的多个 UDP 数据报。
我对套接字编程相当陌生,所以如果在这里有一些误解,请原谅我。谢谢你。