【问题标题】:using splice with socket may cause starvation使用带有套接字的拼接可能会导致饥饿
【发布时间】:2015-08-29 12:09:27
【问题描述】:

我正在写一个TCP代理,使用边缘触发的epoll来监控fd,splice来传输数据。这是问题所在: 我怎么知道套接字接收缓冲区是空的?

例如,如果您通过要求读取一定数量的数据来调用 read(2),而 read(2) 返回的字节数较少,则可以确定文件的读取 I/O 空间已用尽描述符。

但我发现即使 splice(sock, 0, pfd[1], 0, 65536, SPLICE_F_NONBLOCK)

O_NONBLOCK 启用,n > PIPE_BUF 如果管道已满,则 write(2) 失败,errno 设置为 EAGAIN。否则,可能会写入 1 到 n 个字节(即,可能会发生“部分写入”;调用者应检查 write(2) 的返回值以查看实际写入了多少字节),并且这些字节可能与由其他进程写入。

所以我应该重复调用 splice 直到 EAGAIN?但是如何知道socket接收缓冲区是空的还是管道缓冲区满了呢?

【问题讨论】:

    标签: c linux sockets pipe splice


    【解决方案1】:

    也许您可以将getsockopt 系统调用与SO_ERROR 一起使用,然后您将知道哪个套接字真的是EAGAIN,然后使用epoll 来观察该套接字的读/写事件。

    我在向我的网络服务器添加反向 http 代理时也遇到了这个问题,我认为它应该可以工作,但我不确定这是否是最佳解决方案。

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2011-04-22
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多