如何使用非阻塞套接字正确处理发送/写入?
Posted
技术标签:
【中文标题】如何使用非阻塞套接字正确处理发送/写入?【英文标题】:how to properly deal with send/write with a non-blocking socket? 【发布时间】:2015-10-18 23:17:17 【问题描述】:我有一个用于接收和发送数据包的套接字。伪代码是:
setnonblock(fd);
add_event(event_base, recv_ev);
while("I have packets to write")
send(fd, packet);
....
....
现在的问题是,因为 fd 是非阻塞的,所以 send(fd) 在完成发送数据包之前会返回很多。但我希望它能够在程序运行到下一步之前成功发送数据包,或者为它注册一个事件。但是如果我为它注册一个事件,即使没有可用的数据包,该事件也可能被频繁触发(注意数据包不是来自伪代码中的recv(),而是来自其他地方)
那该怎么处理呢?
【问题讨论】:
【参考方案1】:一切都是从前到后。套接字几乎总是可写的。所以你应该:
有数据要发送时发送 在循环中调用每个发送,直到 t 完成或返回零 如果返回零,然后选择可写性,并在触发时继续发送,然后停止选择可写性。【讨论】:
是否有第二项的示例代码(在循环中调用每个发送,直到 t 完成或返回零)?我不明白您的第三项(如果它返回零,则选择可写性,并在触发时继续发送,然后停止选择可写性。)什么是“可写性选择”?谢谢 选择可写性是您的伪代码已经在做的事情。 (2) 的例子比比皆是。以上是关于如何使用非阻塞套接字正确处理发送/写入?的主要内容,如果未能解决你的问题,请参考以下文章