我正在编写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?但是,如何知道套接字接收缓冲区是空的还是管道缓冲区已满?
答案 0 :(得分:0)
也许您可以将getsockopt
系统调用与SO_ERROR
一起使用,然后您将知道哪个套接字真的是EAGAIN
,然后使用epoll
来观察读/写事件那个插座。
我在向我的网络服务器添加反向http代理时也遇到此问题,我认为它应该可行,但我不确定它是否是最佳解决方案。