我有一个实时系统,所以我使用非阻塞套接字发送我的数据 但是发生了套接字缓冲区已满, 所以send函数的返回值小于我的数据长度。
如果我保存返回长度并重新发送,阻塞套接字没有什么不同?
那么我可以获得套接字缓冲区的剩余大小吗?我可以先检查一下, 如果它足够,那么我打电话给发送,跳过发送其他。
谢谢大家。
答案 0 :(得分:1)
阻塞和非阻塞之间存在差异 - 如果您遇到短写,则不会阻止。这就是非阻塞的重点。它让你有机会在等待一些缓冲空间释放时做一些更紧迫的事情。
您的担忧似乎是反复尝试撰写完整的邮件,即一种投票形式。但是检查缓冲区中的空闲字节是一回事,你只需要通过调用write来调用可用性。你真的没有获得任何效率明智的东西。
常见的解决方案是使用select
或poll
之类的东西来监视套接字描述符,以便能够写入(和至少一些)字节。这允许您停止轮询并在内核上强制执行某些工作以监视空间可用性。
也就是说,如果你真的想查看有多少可用空间,那么通常会解决某些特定于平台的问题,主要是ioctl
调用各种平台特定参数,如FIONWRITE
, SIOCOUTQ
等。您需要准确调查平台提供的内容。但是,再一次,最好先考虑一下这是否真的是你需要的东西。
答案 1 :(得分:0)
如果异步send
因EWOULDBLOCK
/ EAGAIN
失败,则不会发送任何数据。然后你可以尝试发送其他东西,或者等到缓冲区再次空闲。
另见https://stackoverflow.com/questions/19391208/when-a-non-blocking-send-only-transfers-partial-data-can-we-assume-it-would-r - 在那里讨论相关问题。