1

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

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

此外,可以将套接字声明为非阻塞读取和阻塞写入吗?还是我应该一直使用 fcntl 在这些行为之间切换?

谢谢!

4

2 回答 2

1

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

于 2013-11-04T01:24:26.527 回答
1

写入套接字阻塞的唯一情况是写入的数据不适合缓冲区。理想情况下,您会以处理读取的方式处理写入。您无需在每次写入之前切换。如果要阻止写入,请使用以下逻辑:

  1. 执行写入。

  2. 如果它完成,你就完成了。

  3. 将套接字切换到阻塞状态。

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

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

于 2013-11-04T00:40:29.653 回答