【发布时间】:2017-08-26 01:50:35
【问题描述】:
我有一个网络课程的作业,在那里我实现了一个简单的客户端服务器应用程序,该应用程序将文件(文本)从服务器下载到客户端。我通过不断读取服务器端的文件并通过send 发送数据并通过recvcalls 接收数据来做到这一点。文本文件很好用。
但我想实现(不是任务的一部分)向这个应用程序发送视频的能力:D(朋友之间不需要笔式驱动器!)。我使用了与发送文件相同的代码,希望它能正常工作。如果我在自己的机器上运行代码(在我的机器上运行的服务器和客户端),则视频已成功传输。但是当服务器和客户端在不同的机器上运行时(我朋友的笔记本电脑上的服务器和我的客户端上),我得到了视频文件,但是一个损坏的! :(
服务器 sn-p 用于发送文件:
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;
}
}
}
客户端 sn-p 用于接收文件:
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.。我真的很想做这个网络应用程序,我可以在我的日常生活中使用!任何想法,sn-ps 哪里出错了?任何帮助表示赞赏。提前致谢! :)
【问题讨论】:
-
1) 有数千个现成且免费可用的应用程序可供您“在日常生活中使用”,这些应用程序将比您命令的更方便、更通用线程序。 2)
recv(socket_client, recvBuff, 1024,0)- 如果收到的字节数少于 1024,将不 阻塞,并且不保证任何读取都会立即为您提供 1024 字节。但是任何这样的阅读都会被视为错误。 -
1) 我说我想做一些我想用的东西。 2)请详细说明/任何替代方案?
-
就这么简单,您可能会收到较短的数据包,这并不意味着没有更多的数据。你必须循环直到你得到
0(套接字关闭)或-1(错误)。 -
继续直到收到 0 个字节。摆脱“1024”检查。
-
服务器中,当文件读取返回0字节时关闭socket。
标签: c sockets video networking file-transfer