2017-08-25 41 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) 
相关问题