2011-10-01 60 views
2

我想實現一個基本的文件服務器。我一直在嘗試使用在這裏找到的sendfile命令:http://linux.die.net/man/2/sendfile我正在使用TCP。你會如何收到一個用'sendfile'發送的文件?

我可以讓它發送很好,但它的發送二進制,我不知道如果這是掛斷。

我試圖用recv來接收文件,但它沒有正確地通過。 是否有一種特殊的方式來接收一個二進制文件,並將其放入一個字符串?

編輯: 要求提供一些代碼,那就是:

SENDFILE呼叫(從服務器進程)

FILE * file = fopen(filename,"rb"); 
    if (file != NULL) 
    {    
     /*FILE EXISITS*/ 
     //Get file size (which is why we opened in binary) 
     fseek(file, 0L, SEEK_END); 
     int sz = ftell(file); 
     fseek(file,0L,SEEK_SET); 

     //Send the file 
     sendfile(fd,(int)file,0,sz); 
     //Cleanup 
     fclose(file); 
    } 

收到呼叫(來自客戶端的過程,甚至超過一個循環基本的,只是想要一個單一的字母)

//recieve file 
    char fileBuffer[1000]; 
    recv(sockfd,fileBuffer,1,0); 
    fprintf(stderr,"\nContents:\n"); 
    fprintf(stderr,"%c",fileBuffer[0]); 

編輯:寫了一些代碼來檢查返回值。 sendfile給errno 9 - 壞文件編號。我假設在我的第二個文件描述符中(我發送的文件)。我把它作爲一個整型,因爲sendfile抱怨它不是int。

我應該如何使用發送文件給定的文件指針代碼,我在上面的sendfile調用中使用過?

+1

你能提供一些代碼,你的sendfile調用和你的recv循環嗎? –

+0

總是檢查系統調用的返回值(fseek,sendfile,recv)。並將結果包含在您的問題中。 – Nemo

回答

2

你不能用FILE*使用sendfile(),你需要一個文件描述符由open()close()和朋友給出。你不能只把一個FILE *變成一個int並且認爲它會起作用。

也許您應該閱讀sendfile()聯機幫助頁以獲取更多信息。

+0

謝謝,我只是不得不使用open而不是fopen。沒有意識到差異。 – user974703

1

沒有特別的方法。您只需收到read()recv()

可能是,您的接收代碼錯誤。

+0

所以如果我要recv到一個字符串,一切都應該變成罰款? – user974703

+0

取決於你是如何做到的。不過,不要指望任何套接字讀取代碼一次讀取整個文件。特別是如果它很大。 – jpalecek

+0

是的,我有一個循環。但即使我可以得到前幾封信,知道它是正確的閱讀。我很快就會看看它。 – user974703

相關問題