非阻塞写入和阻止recv

时间:2014-09-25 04:08:48

标签: c tcp proxy nonblocking

我正在尝试为我的C代理编写并行流,其中数据同时写入并行日志,同时将其转发到目标服务器。基本上我希望有2个主题:

  1. 线程对缓冲区执行非阻塞写入
  2. 第二个线程从缓冲区执行阻塞读取。
  3. 当然,编写者线程可以超越读者线程。因此,无论何时发生缓冲区溢出,我们都会将其标记为错误。

    让我们说线程1(作者)的速度是线程2(读者)的5倍。我希望线程1不要减速,并以读取器速度的5倍写入(即缓冲器不应被读取器等锁定)。这显然会导致缓冲区溢出,因为线程1的写入速度比线程2读取的速度快得多(我想捕获缓冲区溢出)

    我的理解是套接字/文件描述符是阻塞的还是非阻塞的,不能将写操作作为非阻塞和读取阻塞。我猜这是为了避免缓冲区溢出。但是,我对缓冲区溢出很好。

    任何人都可以帮忙设计如何在生产者无阻塞且接收器阻塞的情况下创建这样的并行线程吗?

1 个答案:

答案 0 :(得分:0)

您可以使用select()阻止,直到套接字可读。将其保留为非阻塞模式。如果send()返回-1errno设置为EAGAINEWOULDBLOCK,那么您需要使用select()告诉您套接字何时有再次成为可写。只有在send()报告EAGAIN / EWOULDBLOCK时才会这样做,因为套接字几乎总是可写的。