2017-05-14 59 views
1

我想在C破裂的管道下与插座上

我打开一个数据套接字我的客户(PASV)重新编写一个FTP服务器,当它试图做一个有效的文件RETR的sendfile,我用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 *

问题是,当我做到这一点,在sendfile功能停止与SIGPIPE

我真的不明白为什么,我想我正确地使用它,我无法找到任何解决这个问题尤其如此。

感谢您的帮助:)

+0

的OS,这在libc吗? – alk

+0

当我读到以书面形式向插座的情况下“*破管*”,我倾向于说,接收器断开。 – alk

+0

我正在使用Linux(Deepin 15.4),你是指“哪个libc”?接收器断开,因为服务器崩溃的,我就使用netcat来测试它 –

回答

0

这是因为:

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

所以你需要修复客户端和服务器:客户端不能关闭中间的连接和服务器必须对抗滥用客户稳健。

使用,例如,sigprocmask()执行禁用SIGPIPE。

+0

谢谢,但我只是在插座上连接netcat来接收DATAS,我不认为客户端关闭了连接中间 –