我正在尝试用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
。
我真的不明白为什么,我认为我正确地使用它,我找不到任何解决这个问题的特别。
谢谢你的帮助
1条答案
按热度按时间qnakjoqk1#
这是因为:
1)客户端在传输过程中关闭了连接; 2)系统被配置为发出信号而不是返回EPIPE错误。
因此,您需要修复客户端和服务器:客户端不能在中间关闭连接,服务器必须健壮,防止客户端滥用。
例如,使用sigprocmask()禁用SIGPIPE。