在客户端怎么判断服务器传过来的二进制文件的结束

Aaron_Jerry 2007-06-04 04:06:29
我现在在做一个简单的ftp程序,在下载文件的过程中遇到些问题。我想从服务器下载任意类型的文件,所以我用二进制文件进行读写,


服务器端的代码:

//从服务器获取一个文件
void sget(SOCKET s,char *filename)
{
BOOL bexist;
int nbytes;
FILE *fps;
char buf[BUFFER];
bexist=is_exist_file(filename);//判断文件在服务器当前目录是否存在
if(bexist==FALSE)
{
sprintf(sbuf,"208 get Instruction Error.\n您输入的文件名不存在,请重新输入.\n\n");
bytes=send(s,sbuf,BUFFER,0);//BUFFER是缓冲区大小1024
}
else
{
strcpy(sbuf,"200 get Instruction.\n");
bytes=send(s,sbuf,BUFFER,0);
fps=fopen(filename,"rb"); //以二进制方式打开
if(fps==NULL)
printf("fopen() failed!\n");
//开始下载文件 (下载的核心代码)
while(!feof(fps))
{
nbytes=fread(buf,sizeof(char),BUFFER,fps);
strcpy(sbuf,buf);
bytes=send(s,sbuf,nbytes,0);
}
fclose(fps);
}
}


客户端的代码:

//从服务器获取一个文件
void get(SOCKET s,char *file)
{
FILE *fpd;
char buf[BUFFER+1];
fpd=fopen(file,"wb");
if(fpd==NULL)
printf("fopen() failed!\n");
printf("从服务器当前目录开始下载文件: %s\n",file);
do
{
rbytes=recv(s,buf,BUFFER+1,0);
buf[rbytes]='\0';
fwrite(buf,sizeof(char),rbytes,fpd);
}while(rbytes==BUFFER); //估计问题也就出现在这里把
printf("\n文件下载完成!\n");
fclose(fpd);
}

这样做好象下载不到正确的文件,里面有很多乱码。请各位大虾不吝赐教。不胜感激。
分数好商量!!!由于等级的限制,一次只能放100分。
...全文
449 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aaron_Jerry 2007-06-06
  • 打赏
  • 举报
回复
问题我已经自己解决了 不过还是要谢谢各位热心人。结帖拉 哈哈哈哈~~
jixingzhong 2007-06-04
  • 打赏
  • 举报
回复
参看:http://topic.csdn.net/t/20031014/18/2355429.html
jixingzhong 2007-06-04
  • 打赏
  • 举报
回复
FTP 协议啊 ...
lovejklife 2007-06-04
  • 打赏
  • 举报
回复
还有,用的是非阻塞模式吗
lovejklife 2007-06-04
  • 打赏
  • 举报
回复
Ftp有两个SOCKET一个用于命令,一个用于数据

看楼主的程序不是根据标准FTP协议写的,只是用TCP传个文件。

这个方式应该没问题的,感觉应该是接受后写文件有问题
while((rbytes=recv(SockData,buff,BUFFERSIZE,0))>0)
{
fwrite(buff,rbytes,1,RecvFile);
}
用这个试下,

还有你strcpy(sbuf,buf);很多余
suyouxin 2007-06-04
  • 打赏
  • 举报
回复
在服务器那边每一个文件发送完以后,最后再发送一串数据~!@#$%^&*(),表示文件传完了,当然处理不了文件中本身包含数据~!@#$%^&*()的情况。
spofmy 2007-06-04
  • 打赏
  • 举报
回复
再仔细研究FTP协议
Wolf0403 2007-06-04
  • 打赏
  • 举报
回复
继续仔细研究FTP协议。
lightnut 2007-06-04
  • 打赏
  • 举报
回复
可以设计一个简单的包, 比如 包的长度(4字节)+包的实际数据+包的结束标志(2字节)
等等. 按包发送数据和接受数据.
Aaron_Jerry 2007-06-04
  • 打赏
  • 举报
回复
哦。我也试过把每次发送的长度包含在缓冲区中,到了客户端在解析长度和文件内容,但是好象也不行
Aaron_Jerry 2007-06-04
  • 打赏
  • 举报
回复
补充句: 用的是C语言,控制台程序
星羽 2007-06-04
  • 打赏
  • 举报
回复
楼上书得不错,把长度信息也放过来,可以一起发,也可以分开发
  • 打赏
  • 举报
回复
无法判断,只能先让服务器发送长度,然后按照这个长度接收文件

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧