我有一个用于接收和发送数据包的套接字。伪代码为:
setnonblock(fd);
add_event(event_base, recv_ev);
while("I have packets to write"){
send(fd, packet);
....
}
....
现在的问题是,由于fd是非阻塞的,在它完成发送数据包之前,send(fd)许多返回。但我希望它能在程序运行到下一步之前成功发送数据包,或者为它注册一个事件。但是,如果我为它注册一个事件,即使没有可用的数据包,也可能频繁触发该事件(注意数据包不是来自伪代码中的recv(),而是来自其他地方)
那么如何处理呢?
都是前后颠倒的。套接字几乎总是可写的。所以你应该:
- 当你有数据要发送时发送
- 在循环中调用每个send,直到t完成或返回零
- 如果返回0,然后选择可写性,并在触发时继续发送,然后停止选择可写性。