linux 在套接字上带有sendfile的Broken Pipe C

rxztt3cl  于 5个月前  发布在  Linux
关注(0)|答案(1)|浏览(56)

我正在尝试用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是一个结构体,包含已经打开的数据套接字client->data_soc,而cmd是客户端的命令,包含要打开的文件名cmd->arg,也就是一个char *
问题是,当我这样做时,sendfile函数停止与SIGPIPE
我真的不明白为什么,我认为我正确地使用它,我找不到任何解决这个问题的特别。
谢谢你的帮助

qnakjoqk

qnakjoqk1#

这是因为:
1)客户端在传输过程中关闭了连接; 2)系统被配置为发出信号而不是返回EPIPE错误。
因此,您需要修复客户端和服务器:客户端不能在中间关闭连接,服务器必须健壮,防止客户端滥用。
例如,使用sigprocmask()禁用SIGPIPE。

相关问题