在C

时间:2017-08-25 14:20:05

标签: c sockets video networking file-transfer

我在网络课程中有一个任务,在那里我实现了一个简单的客户端服务器应用程序,它将文件(文本)从服务器下载到客户端。我这样做是通过不断读取服务器端的文件并按send发送数据并通过recv调用接收数据。文本文件很有效。

但是我想实现(不是作业的一部分)这个应用程序的视频发送能力: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.。我真的想制作这个网络应用程序,我可以在日常生活中使用它!任何想法,哪些片段出错了?任何帮助赞赏。提前致谢! :)

1 个答案:

答案 0 :(得分:0)

另一种方式 - 等待消息的所有数据:

while((bytesReceived = recv(socket_client, recvBuff, 1024, MSG_WAITALL)) > 0)