如何使用非阻塞套接字正确处理发送/写入



我有一个用于接收和发送数据包的套接字。伪代码为:

   setnonblock(fd);
   add_event(event_base, recv_ev);
   while("I have packets to write"){
      send(fd, packet);
      ....
   }
   ....

现在的问题是,由于fd是非阻塞的,在它完成发送数据包之前,send(fd)许多返回。但我希望它能在程序运行到下一步之前成功发送数据包,或者为它注册一个事件。但是,如果我为它注册一个事件,即使没有可用的数据包,也可能频繁触发该事件(注意数据包不是来自伪代码中的recv(),而是来自其他地方)

那么如何处理呢?

都是前后颠倒的。套接字几乎总是可写的。所以你应该:

  • 当你有数据要发送时发送
  • 在循环中调用每个send,直到t完成或返回零
  • 如果返回0,然后选择可写性,并在触发时继续发送,然后停止选择可写性。

相关内容

  • 没有找到相关文章

最新更新