怎样在winCE里用socket通信给FTP上传文件?

wmin99   2009-12-14 09:18 楼主
如题:小弟想在winCE里用socket通信给远程主机服务器FTP上传文件(现在是上传的bmp文件),现在连接远程FTP正常,上传的文件却大小都为零,打不开,为什么?是不是要设置为二进制传输模式呢???主要代码如下:


        int  iEnd =0;
        int  ilen =0;
        long iTmp =0;
        CFile file;
        if(!file.Open(L"\\windows\\windowsce.bmp", CFile::modeRead | CFile::typeBinary))
        {
                AfxMessageBox(L"打开文件失败");
                //return -1;
        }
        long lFileSize = file.GetLength();

        char temp[1024];                                //首先用来存放文件大小,后面用作发送文件缓冲区
        memset(temp,0,sizeof(temp));

        _ltoa(lFileSize, temp, 10);


        while (1)
        {
                ilen = file.Read(temp, 1024);
                if (ilen==0)
                {
                //        MessageBox("break");
                        break;
                }
                iEnd = send(sockFile,temp,ilen,0);
                if (iEnd==SOCKET_ERROR)
                {
                        //strError.Format("Send File:%d",error=WSAGetLastError());
                   // AfxMessageBox(strError);
                        AfxMessageBox(L"strError");
                        break;
                }
                iTmp +=iEnd;
                m_JDT.SetPos(iTmp);
       
        }


        file.Close();
            
    closesocket(sockClient);
    WSACleanup();

回复评论 (11)

1.ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。
2.二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
是不是我在ASCII方式下传输二进制文件的原因呢??
点赞  2009-12-14 09:55
没有人会吗?高手出招呀,急死了。。。。。
点赞  2009-12-14 11:48
我用TCP/IP发送就可以 给你个参考代码
//发送
void CTCPIPDlg::OnSend()
{
        // TODO: Add your control notification handler code here



       
        int nErrorCode;
        int cnt = 0, actlen = 0;

        if (m_Socket == NULL)
                return;

        UpdateData(TRUE);
        int sendlen = m_SendEdit.GetLength();                                 //取得输入字符串长度
        char *psendbuff = new char[sendlen];

        for(int i = 0; i < sendlen;i++)
                psendbuff = (char)m_SendEdit.GetAt(i);                 // 转换为单字节字符
       
        while(cnt < sendlen)
        {
                actlen = send(m_Socket, psendbuff + cnt, sendlen - cnt, 0);
                if (actlen == SOCKET_ERROR )
                {
                        MessageBox(_T("TCP 数据发送失败!"));
                        nErrorCode = WSAGetLastError();
                        delete[] psendbuff;
                        return;
                }

                cnt = cnt + actlen;
                if (cnt < sendlen)
                        Sleep(1000);
        }
       
        delete[] psendbuff;



       
}
点赞  2009-12-14 13:15
学习了一把。。。
点赞  2009-12-14 14:07
还是不行呀
怎么办呀,试了快两周了呀
点赞  2009-12-14 14:49
坚定不移地顶!!!
点赞  2009-12-14 15:31
WinCE下有封装好的FTP API啊,直接用这个会比较方便一点。
点赞  2009-12-14 15:35
FtpOpenFile等API,具体你可以查看一下帮助,
自己用Socket来实现,估计会比较麻烦一点。
点赞  2009-12-14 15:37
引用: 引用 7 楼 sunrain_hjb 的回复:
WinCE下有封装好的FTP API啊,直接用这个会比较方便一点。

哪个API是不是那个FTPputFile,FTPgetfile这样的函数????
点赞  2009-12-14 16:02
上面的函数不能实现适时地看到上传进度呀!!!而且速度很慢!!!我想用socket来实现,这样既能看到进度条,适时的上传进度,而且速度也能得到提升!!!大家来看看吧,这真是一个旷世难题呀!!!
点赞  2009-12-14 16:05
是不是我在读文件时没有处理好字节转换的问题??EVC真是麻烦呀,什么都不支持!!!
点赞  2009-12-14 16:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复