我现在需要这样一个功能,但是用了VB来写,我用Winsock控件,达不到要求,它一次只可以传输8KB的数据,但是采用多个send,又说什么块什么的,底层无法控制,我想应该用VC做了,各位给点代码吧

解决方案 »

  1.   

    好啊,伊妹儿来了  [email protected]
      

  2.   

    http://expert.csdn.net/Expert/topic/1257/1257670.xml?temp=.5817377
      

  3.   

    win98ddk(阿发,你在干嘛?上来!上来!!给我上来) :给你发了,收运到了码?
      

  4.   

    to liangrq(大笨钟):
    哥们,给我也发一份吧:
    [email protected]
      

  5.   

    to liangrq(大笨钟):
    哥们,给我也发一份吧:[email protected]:)
      

  6.   

    不用明天了,我看了,当场发现问题。代码采用的是阻塞的模式,假设
    sockSrvr.Listen()
    之后没有人连接上来,则会产生长时间的等待。
    还有,不能够支持多用户的连接
      

  7.   

    win98ddk,
        你就不能改一下应用到你的程序中吗?
        给你的程序是最简单的实现了文件的传输功能的了。
      

  8.   


    /*===============================文件传输======================================================
        功能:把指定的文件传输到指定IP地址的计算机。
    参数:strIP : 目的计算机的IP地址。
          uPort : 端口号。
      chSrc : 文件路径及名称。
      bSend : 文件不存在时是否建立一个新文件。
        返回值:
    =============================================================================================*/
    BOOL CopyFileClient(CString strIP, UINT uPort, char *chSrc, BOOL bSend)
    {
    BOOL bRet = FALSE;
    CSocket sckClient;
    CFile file;
    do
    {
    if(bSend)
    {
    bRet = file.Open(chSrc, CFile::modeRead);
    }
    else
    {
    bRet = file.Open(chSrc, CFile::modeCreate | CFile::modeWrite);
    }
    if(!bRet)
    {
    break ;
    }
    bRet = sckClient.Create();
    if(!bRet)
    {
    break ;
    }
    bRet = sckClient.Connect(strIP, uPort);
    if(!bRet)
    {
    break ;
    }
    BYTE *chFileData = new BYTE[ 1024 + 1 ];
    char chData[10];
    int nSize = 0;
    if(bSend)
    {
    nSize = file.GetLength();
    int nRead = nSize;
    ZeroMemory(chData, 10);
    memcpy(chData, &nSize, sizeof(int));
    int nRet = sckClient.Send(chData, sizeof(int));
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    while(nRead > 0)
    {
    int n1 = min(nRead, 1024);
    int n2 = file.Read(chFileData, n1);
    nRead -= n2;
    nRet = sckClient.Send(chFileData, n2);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }

    bRet = TRUE;
    }
    }
    else
    {
    char chData[10];
    ZeroMemory(chData, 10);
    nSize = 0;
    int nRet = sckClient.Receive(chData, 10);//读文件大小
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    nSize = *((int*)(chData));
    if(nSize <= 0)
    {
    bRet = FALSE;
    break ;
    }
    BYTE *chFileData = new BYTE[1024+1];
    int nWrite = 0;
    while(nWrite < nSize)
    {
    nRet = sckClient.Receive(chFileData, 1024);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    file.Write(chFileData, nRet);
    nWrite += nRet;
    bRet = TRUE;
    }
    }
    delete []chFileData;
    if(!bRet) // 送文件数据出错.
    {
    break ;
    }
    }while(0);
    if(sckClient.m_hSocket != INVALID_SOCKET)
    {
    sckClient.Close();
    }
    if(file.m_hFile != CFile::hFileNull)
    {
    file.Close();
    } return bRet;
    }
    /*===============================文件接收======================================================
        功能:把接收的数据保存到指定的文件中。
    参数:uPort : 端口号。
      chSrc : 文件路径及名称。
      bSend : 文件不存在时是否建立一个新文件。
        返回值:
    =============================================================================================*/BOOL CopyFileServer(UINT uPort, char *chDes, BOOL bSend)
    {
    BOOL bRet = FALSE;
    CFile file;
    CSocket sckServer;
    CSocket sckClient;
    do
    {
    if(!bSend)
    {
    bRet = file.Open(chDes, CFile::modeCreate | CFile::modeWrite);
    }
    else
    {
    bRet = file.Open(chDes, CFile::modeRead);
    }
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Create(uPort);
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Listen();
    if(!bRet)
    {
    break ;
    }
    bRet = sckServer.Accept(sckClient);
    if(!bRet)
    {
    break ;
    }
    char chData[10];
    BYTE *chFileData = new BYTE[1024+1];
    int nSize = 0;
    if(!bSend)
    {
    ZeroMemory(chData, 10);
    int nRet = sckClient.Receive(chData, 10);//读文件大小
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    nSize = *((int*)(chData));
    if(nSize <= 0)
    {
    bRet = FALSE;
    break ;
    }
    int nWrite = 0;
    while(nWrite < nSize)
    {
    nRet = sckClient.Receive(chFileData, 1024);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    file.Write(chFileData, nRet);
    nWrite += nRet;

    bRet = TRUE;
    }
    }
    else
    {
    nSize = file.GetLength();
    int nRead = nSize;
    ZeroMemory(chData, 10);
    memcpy(chData, &nSize, sizeof(int));
    int nRet = sckClient.Send(chData, sizeof(int));
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }
    while(nRead > 0)
    {
    int n1 = min(nRead, 1024);
    int n2 = file.Read(chFileData, n1);
    nRead -= n2;
    nRet = sckClient.Send(chFileData, n2);
    if(nRet <= 0)
    {
    bRet = FALSE;
    break ;
    }

    bRet = TRUE;
    }
    }
    delete []chFileData;
    }while(0);
    if(sckClient.m_hSocket != INVALID_SOCKET)
    {
    sckClient.Close();
    }
    if(sckServer.m_hSocket != INVALID_SOCKET)
    {
    sckServer.Close();
    }
    if(file.m_hFile != CFile::hFileNull)
    {
    file.Close();
    } return bRet;
    }
      

  9.   

    to:liangrq(大笨钟)
    我给你发了mail,请指教