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);