【发布时间】: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