2014-03-24 161 views
-1

我正在寫一個TCP服務器/客戶端程序,並希望將文件從服務器發送到客戶端。這是我的代碼,無法發送文件。我使用recv()send()發送文件。提前致謝。TCP客戶端/服務器發送/接收文件

客戶端:

char *location = "/home/kostas/Downloads/download.txt"; 
FILE *download = fopen(location, "w+"); 
if(download == NULL) 
{ 
    printf("Error\n"); 
    fflush(stdout); 
} 
int transfer = 0; 
memset(buffer, 0, 1024); 
while((transfer = recv(connFd, buffer, 1024 , 0) > 0)) 
{ 
    int write = fwrite(buffer, sizeof(char), transfer, download); 
    memset(buffer, 0, 1024); 
    if((transfer == 0) || (transfer != 1024)) 
    { 
     break; 
    } 
} 
memset(buffer, 0, 1024); 
if(read(connFd, buffer, sizeof(buffer)) < 0) 
{ 
    printf("Read error\n"); 
    fflush(stdout); 
} 

服務器端:

//i get the filename by read/write 
FILE *file = fopen(fileName, "r"); 
memset(buffer, 0, 1024); 
int i = 0; 
while((i = fread(buffer, sizeof(char), 1024, file)) < 0) 
{ 
    if(send(connFd, buffer, i, 0) < 0) 
    { 
     printf("Error\n"); 
     fflush(stdout); 
    } 
    memset(buffer, 0, 1024); 
} 

我不知道我做錯了嗎?之後,我打算使用posix線程來實現文件傳輸。

+0

再次檢查接收'while'循環,你放錯了一些括號。實際上,你在服務器的讀取循環中遇到同樣的問題。您可能需要檢查[此運算符優先級表](http://en.cppreference。COM/W/C /語言/ operator_precedence)。 –

+0

donte告訴我i = fread ... <0.讓我檢查一下,但我認爲這是我的錯誤。 – KostasRim

+0

我確實改變了它,但它仍然不起作用:/ – KostasRim

回答

1
while((transfer = recv(connFd, buffer, 1024 , 0) > 0)) { 
    int write = fwrite(buffer, sizeof(char), transfer, download); 

你很高興在這裏。

memset(buffer, 0, 1024); 

毫無意義。去掉。

if((transfer == 0) || (transfer != 1024)) 
{ 
    break; 
} 

transfer(一)不能爲零,在這一點上,和(b)可以是1和1024之間在這裏什麼。沒有理由停止,如果它不是1024.刪除這個塊。

memset(buffer, 0, 1024); 

毫無意義。去掉。

if(read(connFd, buffer, sizeof(buffer)) < 0) 
{ 
    printf("Read error\n"); 
    fflush(stdout); 
} 

您需要的read()結果存儲在一個變量,以及:

  • 測試爲-1,這表明讀取錯誤,你應該打印,通過perror()strerror()
  • 測試它爲零,這表明流結束
  • 否則將它用作以下代碼中的讀取計數,就像上面一樣。

但我不知道你爲什麼在這裏讀什麼。輸入已耗盡或發生讀取錯誤。去掉它。

memset(buffer, 0, 1024); 

毫無意義。去掉。

int i = 0; 

初始化毫無意義。去掉。

while((i = fread(buffer, sizeof(char), 1024, file)) < 0) 
{ 
    if(send(connFd, buffer, i, 0) < 0) 
    { 
     printf("Error\n"); 

在這一點上,您還是應該打印錯誤,如上所述。只是打印'錯誤'是沒用的。發生時,您會立即想知道它是什麼,您將不得不返回並修改代碼以找出答案。

memset(buffer, 0, 1024); 

毫無意義。去掉。

+1

3年後!這是我第一次參加網絡課程(我是在我的第二年)。我記得我已經修復了錯誤,因爲我在該練習中取得了很好的成績!謝謝你的回答! – KostasRim

相關問題