在socket上使用sendfile断开管道C.

时间:2017-05-14 13:36:25

标签: c linux sockets

我正在尝试用C语言重新编码FTP服务器。

我打开一个数据套接字到我的客户端(PASV),当它尝试对有效文件进行RETR时,我从请求数据套接字的文件中使用sendfile

int fd;
struct stat s;

if (cmd->arg && (fd = open(cmd->arg, O_RDWR)) != -1)    
{
    fstat(fd, &s);
    if ((size = sendfile(client->data_soc, fd, NULL, s.st_size))
        == -1)
       perror("sendfile failed:");
    else
       printf("datas sended\n");
       close(client->data_soc);
}

客户端是一个包含已打开的数据套接字client->data_soc的结构,cmd是客户端的命令,包含要打开的文件的名称cmd->arg,其为char *。< / p>

问题是当我这样做时,sendfile功能会停止SIGPIPE

我真的不明白为什么,我认为我正确使用它,特别是找不到任何解决方案。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

这是因为:

1)客户端在转移过程中关闭了连接;和  2)系统配置为发出信号而不是返回EPIPE错误。

因此,您需要修复客户端和服务器:客户端不得在中间关闭连接,并且服务器必须能够抵御客户端滥用。

例如,使用sigprocmask()来禁用SIGPIPE。