问题如下:
有一个本地文件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         : 用来传递文件数据的sockvoid 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写的代码。

解决方案 »

  1.   

    FTP下载首先要用FTP命令获取文件大小,根据这个大小来下载。上传也要先用FTP命令。
      

  2.   

    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;
    }
    }
    用这个传的函数试试
      

  3.   

    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;
    }
    }