2017-08-25 52 views
0

我在網絡課程中進行了一項任務,在那裏我實現了一個簡單的客戶端服務器應用程序,用於從服務器向客戶端下載文件(文本)。這是我通過不斷讀取服務器端文件並通過send發送數據並通過recv調用接收數據。文本文件效果很好。製作我自己的視頻發送網絡應用程序C

但我想實現(不是任務的一部分)視頻發送能力到這個應用程序:D(不需要在朋友之間筆驅動器!)。我使用相同的代碼發送文件,希望它可以工作。如果我在自己的機器上運行代碼(服務器和客戶端在我的機器上運行),視頻已成功傳輸。但是當服務器和客戶端運行在不同的機器上(我朋友的筆記本電腦上的服務器和我的客戶端上的服務器)時,我得到了視頻文件,但是損壞了!

void sendFile(FILE * fp, int * arg) 
{ 
    int socket=(int)*arg; 

    while(1) 
    { 
     /* First read file in chunks of 256 bytes */ 
     char buff[1024]={0}; 
     if(fp==NULL) 
     { 
      printf("File open error"); 
      return; 
     } 

     int nread = fread(buff,1,1024,fp); 

     /* If read was success, send data. */ 
     if(nread > 0) 
     { 

      if(nread != 1024) 
       buff[nread] = 0; 
      send(socket, buff, nread,0); 
     } 
     if (nread < 1024) 
     { 
      if (ferror(fp)) 
       printf("Error reading\n"); 
      break; 
     } 
    } 
} 

客戶段用於接收文件:

FILE * fp = fopen(fileName,"wb"); 
if(fp == NULL) 
{ 
    printf("Error opening file"); 
    return 1; 
} 

int bytesReceived = 0; 
char recvBuff[1024]; 
while((bytesReceived = recv(socket_client, recvBuff, 1024,0)) > 0) 
{ 
    fwrite(recvBuff, 1,bytesReceived,fp);  
    if(bytesReceived < 1024) 
     break; 
} 
fclose(fp); 
printf("File successfully downloaded!\n"); 

下載後的視頻文件給出了錯誤:發送文件:(

服務器片段。This file is incomplete and cannot be played.我真的想使這個網絡應用程序,我可以在我的日常生活中使用!任何想法,其中的片段出現錯誤?任何幫助讚賞。提前致謝!:)

+0

1)有*成千上萬*你「能在日常生活中使用」現成的和免費的應用程序,這將是方式更方便,比你更加靈活命令行程序。 2)'recv(socket_client,recvBuff,1024,0)' - 如果接收到的字節少於1024字節,將不會*阻塞,並且不保證任何讀取會立即給你1024個字節。但是任何這樣的閱讀都會被視爲錯誤。 –

+0

1)我說我想做一些我想用的東西。 2)請詳細說明/任何替代品? – Akash

+0

很簡單,你可能會收到更短的數據包,這並不意味着沒有更多的數據。你必須循環,直到你得到'0'(套接字關閉)或'-1'(錯誤)。 –

回答

0

另一種方法 - 等待消息的所有數據:

while((bytesReceived = recv(socket_client, recvBuff, 1024, MSG_WAITALL)) > 0) 
相關問題