Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从插座到管道的拼接_C_Linux_Sockets_Pipe - Fatal编程技术网

C 从插座到管道的拼接

C 从插座到管道的拼接,c,linux,sockets,pipe,C,Linux,Sockets,Pipe,此代码基于从套接字到管道以及从管道到文件的拼接,但由于某些原因,对拼接的第一次调用从未返回 static size_t splice_from_net_to_file(int infd, int outfd) { int p[2]; size_t total = 0; if (pipe(p) == -1) return error("pipe"); while (1) { int ret; ret = ssplic

此代码基于从套接字到管道以及从管道到文件的拼接,但由于某些原因,对拼接的第一次调用从未返回

static size_t splice_from_net_to_file(int infd, int outfd)
{
    int p[2];
    size_t total = 0;

    if (pipe(p) == -1)
        return error("pipe");
    while (1) {
        int ret;
        ret = ssplice(infd, NULL, p[1], NULL, splice_size, 0);

        if (ret < 0) {
            close(p[0]);
            close(p[1]);
            return error("splice in pipe");
        }
        else if (!ret)
            break;
        while (ret > 0) {
            int written = ssplice(p[0], NULL, outfd, NULL, ret, 0);
            if (written <= 0) {
                close(p[0]);
                close(p[1]);
                return error("splice out pipe");
            }
            ret -= written;
            total += written;
        }       
    }
    close(p[0]);
    close(p[1]);
    return total;
}
静态大小\u t从\u网络\u拼接到\u文件(int infd,int outpd)
{
int p[2];
总尺寸=0;
如果(管道(p)=-1)
返回错误(“管道”);
而(1){
int ret;
ret=ssplice(infd,NULL,p[1],NULL,拼接尺寸,0);
如果(ret<0){
接近(p[0]);
关闭(p[1]);
返回错误(“管道中的拼接”);
}
否则如果(!ret)
打破
而(ret>0){
int writed=ssplice(p[0],NULL,outpd,NULL,ret,0);

如果(已写入是否可能尚未在管道的另一侧启动侦听器?

拼接大小在哪里初始化?

我认为这会阻塞,因为写入时管道上没有读取器。 您应该能够通过使用
fork()
解决此问题

#包括
#包括
#包括
静态大小\u t从\u网络\u拼接到\u文件(int infd,int outfd)
{
int p[2];
pid_t fpid;
总尺寸=0;
如果(管道(p)=-1)
返回错误(“管道”);
fpid=fork();
如果(fpid==-1)
返回错误(“fork”);
如果(!fpid)/*子项*/
{
int ret;
关闭(p[0]);/*不需要读取结束*/
而((ret=ssplice(infd,NULL,p[1],NULL,拼接尺寸,0))>0)
;
关闭(p[1]);
如果(ret<0)
{
/*错误(“管道中的接头”)*/
出口(-1);
}
出口(0);
}
其他的
{
/*母公司*/
int ret;
关闭(p[1]);/*不需要写结尾*/
而((ret=ssplice(p[0],NULL,outpd,NULL,拼接尺寸,0))>0)
总+=净收益率;
接近(p[0]);
waitpid(fpid,NULL,0);
如果(ret<0)
{
返回错误(“拼接管”);
}
}
返回总数;
}

我想我刚刚遇到了这个问题-这是由于在2.6.32中修复了一个内核错误-有关详细信息,请参阅

我在中找到了一个解决方法-将第一个splice()调用从

ret = ssplice(infd, NULL, p[1], NULL, splice_size, 0);

因此,您可以限制请求的数据量


这使它在2.6.31上为我工作。

来自splice fromnet.c静态无符号int splice_size=splice_size;#定义splice_size(64*1024)未修改的splice fromnet是否在您的系统上正常工作?并且基于它的代码仅断开?
ret = ssplice(infd, NULL, p[1], NULL, splice_size, 0);
ret = ssplice(infd, NULL, p[1], NULL, MIN(splice_size, 16384), 0);