何时写入套接字块?

时间:2013-11-04 00:38:21

标签: c linux multithreading sockets blocking

我正在编写一个基于epoll循环和线程池的网络应用程序来处理请求。在每个线程中,我特别注意不要阻止客户端读取,使用非阻塞套接字,并在读取返回EAGAIN(或EWOULDBLOCK为POSIX兼容...)后立即返回。

我是否应该特别注意套接字写入?我没有看到自己发送足够的数据来填充系统TCP缓冲区,并且阻塞一段时间不应该太有害。这是唯一的情况,其中写入套接字阻止?缓冲区大小不够?

此外,套接字是否可以被声明为非阻塞读取和阻止写入?或者我应该一直使用fcntl来切换这些行为吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

对套接字块进行写操作的唯一情况是写入的数据不适合缓冲区。理想情况下,您可以像处理读取一样处理写入。在每次写入之前不需要切换。如果要阻止写入,请使用以下逻辑:

  1. 执行写作。

  2. 如果完成,您就完成了。

  3. 将套接字切换为阻止。

  4. 执行写入的(其余部分)。

  5. 将套接字切换回非阻塞状态。

答案 1 :(得分:1)

处理此问题的正确方法是在您使用非阻塞读取的情况下使用非阻塞I / O.当你执行写操作时,如果你得到-1 / EWOULDBLOCK,则开始在该套接字上选择可写性,当你得到它时,重试写。如果成功,请停止选择该套接字的可写性。不要切换到该套接字的阻塞模式,它会破坏整个目的。