使用带插座的接头可能会导致饥饿

时间:2015-06-13 16:07:21

标签: c linux sockets pipe splice

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

  

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

但我发现即使拼接(袜子,0,pfd [1],0,65536,SPLICE_F_NONBLOCK)< 65536有时可能导致饥饿。

  

启用O_NONBLOCK,n> PIPE_BUF   如果管道已满,则write(2)失败,并将errno设置为EAGAIN。否则,可以写入1到n个字节(即,可以发生"部分写入"调用者应该从write(2)检查返回值以查看实际写入的字节数),以及这些字节可以与其他进程的写入交织。

所以我应该重复调用拼接到EAGAIN?但是,如何知道套接字接收缓冲区是空的还是管道缓冲区已满?

1 个答案:

答案 0 :(得分:0)

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

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