用socket编写ftp client遇到的上传和下载问题

古董啊 2008-04-23 11:53:41
问题如下:
有一个本地文件x.rm(在winxp系统下查看属性,了解到它的原始大小21.0 MB (22,045,438 字节)),将它用自己写的程序testFTP上传到服务器,返回大小变为22045197bytes!然后下载完成后查看下载的文件大小为22118406bytes!改用flashfxp下载此文件,下载完后,查看文件大小与testFTP下载的大小一样都是22118406bytes!用kmplayer不能正常播放(注:testFtp及FlashFxp下载的文件和未上传的文件分处不同的目录)

删掉服务器上的x.rm,改用flashfxp上传x.rm,返回大小为(22045197 bytes),再用flashfxp下载此文件,实际下载下来的文件原始大小为21.0 MB (22,118,406 字节),也不能用播放器正常播放!

注:ftpserver使用的是

ProFTPD 1.2.10 Server (ProFTPD Default Installation)
SYST:215 UNIX Type: L8



我想,有这么几个原因:

这是怎么回事???那位高手给我解答一下?贴上我的上传和下载的函数:

/////////////////////////////////////////////////////////////////////////////
// 下载文件到服务器
// localfilename:下载下来的文件保存在本地的路径
// sock : 用来传递文件数据的sock
void download_file(char* localfilename,SOCKET sock)
{
FILE *fd;
char buff[4096];
buff[4095] = '\0';

int n_bytes = 0;
int n_recv = 0;

fd = fopen(localfilename, "w+b");
while (1)
{
n_recv = recv(sock, buff, 4094, 0);
n_bytes = fwrite(buff, sizeof(char), n_recv, fd);

if (n_recv == 0) {
break;
}

n_recv = 0;

memset(buff, 0x0, n_bytes);

}

fclose(fd);
closesocket(sock);
}

/////////////////////////////////////////////////////////////////////////////
// 上传文件到服务器
// localfilename:要上传的文件保存在本地的路径
// sock : 用来传递文件数据的sock

void upload_file(char* localfilename,SOCKET sock)
{
FILE *fd;
char buff[4096];
buff[4095] = '\0';

int n_bytes = 0;
int n_send = 0;


fd = fopen(localfilename, "rb");

while (!feof(fd)) {

n_bytes = fread(buff, sizeof(char), 4094, fd);
n_send = send(sock, buff, n_bytes, 0);

memset(buff, 0x0, n_send);

}

fclose(fd);
closesocket(sock);
}
我这样写是否有错??能告诉我怎样修改吗?最好能提供我一个winsock写的代码。
...全文
78 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
lin_style 2008-04-25
  • 打赏
  • 举报
回复
int ftp_send_data(int sock_fd, char *data, int len)
{
int num, off = 0, left = len;

while (1) {
num = write(sock_fd, data + off, left);
if (num < 0) {
if (errno == EINTR)
continue;
return num;
}
if (num < left) {
left -= num;
off += num;
continue;
}
return len;
}
}
lin_style 2008-04-25
  • 打赏
  • 举报
回复
int ftp_send_data(int sock_fd, char *data, int len)
{
int num, off = 0, left = len;

while (1) {
num = write(sock_fd, data + off, left);
if (num < 0) {
if (errno == EINTR)
continue;
return num;
}
if (num < left) {
left -= num;
off += num;
continue;
}
return len;
}
}
用这个传的函数试试
菜牛 2008-04-25
  • 打赏
  • 举报
回复
FTP下载首先要用FTP命令获取文件大小,根据这个大小来下载。上传也要先用FTP命令。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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