我正在尝试用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
。
我真的不明白为什么,我认为我正确使用它,特别是找不到任何解决方案。
感谢您的帮助:)
答案 0 :(得分:0)
这是因为:
1)客户端在转移过程中关闭了连接;和 2)系统配置为发出信号而不是返回EPIPE错误。
因此,您需要修复客户端和服务器:客户端不得在中间关闭连接,并且服务器必须能够抵御客户端滥用。
例如,使用sigprocmask()来禁用SIGPIPE。