我正在使用SOCK_SEQPACKET连接,对我来说,确保通过单次write()/ send()调用发送整个缓冲区至关重要。我还使用设备驱动程序,该驱动程序旨在通过单个调用处理完整的数据块。同时我想处理由于缓冲区溢出而导致write()/ send()阻塞的情况,即我想知道当前实现是否在这里遇到瓶颈。我正在使用glibc,Linux 2.6。
我需要实现一个接受缓冲区的方法,它要么完全发送一个缓冲区,要么指示由于阻塞而导致的失败(即系统缓冲区溢出)。
看起来使用send(...,MSG_DONTWAIT)/ fcntl(...,O_NONBLOCK)不是解决方案,因为它们在报告EWOULDBLOCK / EAGAIN之前接受部分写入。有没有办法检查传出缓冲区中是否有足够的空间,或者是否存在专用的写入完成或失败方法?
或者,是否可以通过其他方式检测阻塞?例如,计时器+信号似乎是一个选项,但我不喜欢为每次写入设置它。
提前谢谢。
答案 0 :(得分:1)
实验表明,我的设置(glibc 2.11.1,内核2.6.32-29)没有发生部分发送,并且发送(... MSG_DONTWAIT)返回EAGAIN / EWOULDBLOCK,如预期的AF_UNIX + SOL_SEQPACKET套接字。< / p>
不确定行为是否具有普遍性。
答案 1 :(得分:0)
在套接字上读取SO_SNDLOWAT的值将为您提供有关可以在不冒部分发送风险的情况下发送的消息大小的线索。