c - 非阻塞写入,阻塞接收

标签 c tcp proxy nonblocking

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

  1. 线程对缓冲区进行非阻塞写入
  2. 第二个线程从缓冲区进行阻塞读取。

当然,写入线程可以超过读取线程。因此,每当发生缓冲区溢出时,我们都会将其引发并将其标记为错误。

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

我的理解是套接字/文件描述符要么是阻塞的,要么是非阻塞的,不能将写操作作为非阻塞而将读操作作为阻塞。我猜这是为了避免缓冲区溢出。不过,我对缓冲区溢出很满意。

任何人都可以帮助设计如何在生产者非阻塞而接收者阻塞的情况下创建此类并行线程吗?

最佳答案

您可以使用 select() 进行阻塞,直到套接字可读。让它处于非阻塞模式。如果 send() 返回 -1errno 设置为 EAGAINEWOULDBLOCK那么您需要使用select()来告诉您套接字何时再次可写。仅当 send() 报告 EAGAIN/EWOULDBLOCK 时执行此操作,因为套接字几乎总是可写的。

关于c - 非阻塞写入,阻塞接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26030329/

相关文章:

symfony2 在 Amazon ELB : always trust proxy data? 后面

python - Selenium - PhantomJS 的 Https 问题和 Firefox 的代理身份验证

c - 随机化在c中打印什么字符串

c - 是否可以将整数传递给字符串的精度说明符

c - 将分隔的平面文件解析为结构的双向链表

c# - 连接android客户端成为C#服务器

c - 服务器 TCP 卡在 read() 上

c - 使用打开的文件描述符

c - TCP套接字客户端和服务器在一个程序中使用c Linux

python - 使用Python登录企业代理服务器提取数据