我自己用Socket封装了FTP,功能都实现了,就是不知道怎么实现上传进度
不知道什么原理??SOCKET有什么回调函数来返回服务断接收的字节,或者有什么别的办法实现??
郁闷ing.............,那怎么判断缓冲区的字节有没有发送完呢,用什么函数完成
GetSockOpt和SetSockOpt这个2个函数对我这个问题有帮助吗????
贴一段上传代码
         SetBinaryMode(true);//设置传输模式
CreateDataSocket();//创建数据连接
SendCommand("STOR "+filename+"\r\n"); if( !(retvalue == 125 || retvalue == 150) )
{
AfxMessageBox(reply.Mid(4));
}

ds.Send(buf,len,0);//发送数据

if (ds!=NULL)
{
ds.Close();
}

replyline();
if( !(retvalue == 226 || retvalue == 250) )
{
AfxMessageBox(reply.Mid(4));
}
SetBinaryMode(false);

解决方案 »

  1.   

    http://www.codeproject.com/internet/getwebfile.asp
    http://www.codeproject.com/internet/ftpserver.asp好象没有取得发送字节的函数,的自己计算发送了多少。你看看上面的两个别人写的ftp
      

  2.   

    http://www.codeproject.com/internet/FTPClientClass.asp 
    这个是做的一个ftp client class 也许对你又帮助。
    如果判断buffer还有没有发送完数据你,你的在每个函数返回的发送实际字节和你想要发送的size 比较了。在接受端一样做验证,如果sent_size == you_want_sent 那么说明发送成功了。
      

  3.   

    SendDlgItemMessage(IDC_PROGRESS, WM_USER+2, (已发送字节数*100)/欲发送字节数, 0);
    m_pro.UpdateWindow();
    其中,m_pro是你的进度条控件,IDC_PROGRESS是其ID。
      

  4.   

    阻塞模式是:如果程序在没有收到响应数据的时候程序不会执行下去,一直处于等待状态,知道timeout,对于非常非阻塞模式程序在函数调用后立即执行下一步的代码,而不是处于等待相应数据的到来。这就是阻塞于非阻塞的区别(同步和异步socket)
      

  5.   

    那我定义的CSocket s
    然后s.send(...)这种是阻塞还不非阻塞的
    比如int p;
    while(1)
    {
       p=s.send()
       //这样发送是阻塞吗??好象函数都是马上返回值的
    }
    该怎么解决呢??
      

  6.   

    CSocket::IsBlocking 可知道是否是Blocking的.CSocket 是继承CAsyncSocket 的看看这个介绍
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_casyncsocket.3a3a.send.asp
      

  7.   

    void CMyAsyncSocket ::OnSend(int nErrorCode)
    {
       while (m_nBytesSent < m_nBytesBufferSize)
       {
          int dwBytes;      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent, 
             m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
          {
             if (GetLastError() == WSAEWOULDBLOCK) break;
             else
             {
                TCHAR szError[256];
                wsprintf(szError, "Server Socket failed to send: %d", 
                   GetLastError());
                Close();
                AfxMessageBox (szError);
             }
          }
          else
          {
             m_nBytesSent += dwBytes;
          }
       }
       if (m_nBytesSent == m_nBytesBufferSize)
          {
             m_nBytesSent = m_nBytesBufferSize = 0;
             m_sendBuffer = "";
          }
       CAsyncSocket::OnSend(nErrorCode);
    }
      

  8.   

    完整的介绍:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_windows_sockets.3a_.blocking.asp
      

  9.   

    在接受数据的时候有blocking 和non-blocking 区分的在send 的时候没有的。你大可不必管是否是blocking的因为mic说,CSocket已经替你管理了,你只要使用活是继承创建自己的socket类就可以了。PS:(用金山词巴翻译)English 非常重要哦。
      

  10.   

    mixtrue(土匪他爹)
    怎么判断上传的大小呢
    TO: hansblue(爱华者) 
    交流一下,你是怎么搞的啊