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

时间:2015-10-18 23:17:18

标签: sockets network-programming libevent

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

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

   ....

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

那么如何应对呢?

1 个答案:

答案 0 :(得分:1)

这一切都回到了前面。套接字几乎总是可写的。所以你应该:

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