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,我不認爲客戶端關閉了連接中間 –