我想用winsock来传送文件,一下是CAsyncSocket服务器方的编程:
void CAsyncSocket::OnBtnListen() 
{
// TODO: Add extra validation here
ListenSocket.Create(9000);
ListenSocket.Listen();

}void CAsyncSocket::OnAccept()
{
   ListenSocket.Accept(ConnectedSocket);
 
}void CAsyncSocket::OnReceive()
{
  
  BYTE dwValue; 
CSocketFile  *sw_file;
  CArchive *sw_in;
 // CArchive* dwValue;
  sw_file=new CSocketFile(&ConnectedSocket);
  sw_in=new CArchive(sw_file,CArchive::load);
  if(sw_in->IsLoading)
  {
  sw_in->Flush();
  *sw_in >> dwValue;///到这里我就不知道该怎么办了?
  }                         //客户方发送来的是文件,
                            //我用CSocketFile,CAchive来接受,到了这部我不
}                           //该怎么办了,怎么把CAchive手机来的数据转为文件各位老大,帮我看看吧!!!给出解答立即给分!!!

解决方案 »

  1.   


    typedef struct _SOCKET_STREAM_FILE_INFO {    TCHAR       szFileTitle[128];                   //文件的标题名
        DWORD       dwFileAttributes;                   //文件的属性
        FILETIME    ftCreationTime;                     //文件的创建时间
        FILETIME    ftLastAccessTime;                   //文件的最后访问时间
        FILETIME    ftLastWriteTime;                    //文件的最后修改时间
        DWORD       nFileSizeHigh;                      //文件大小的高位双字
        DWORD       nFileSizeLow;                       //文件大小的低位双字
        DWORD       dwReserved0;                        //保留,为0
        DWORD       dwReserved1;                        //保留,为0} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;
    void CFile_Transfer::OnDataReceive()
    {

    CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
    pStatus->SetFont(&pFrame->m_font,TRUE);
    CSocket sockClient;
    sockClient.Create();
    sockClient.Bind(808,NULL);

    CString szIP;

        OnTransIP();
    szIP=m_desIP;

    sockClient.CancelBlockingCall();

    int buf=10240;
    sockClient.SetSockOpt(SO_SNDBUF,(char*)&buf,sizeof(int),SOL_SOCKET);
        sockClient.SetSockOpt(SO_RCVBUF,(char*)&buf,sizeof(int),SOL_SOCKET);

    int timeout=300; 
    int status=setsockopt(sockClient,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout)); 


    if(!sockClient.Connect((LPCTSTR)szIP, 800))
    {
    //        Invalidate();
    m_conFlag=FALSE;
    pStatus->SetPaneText(1,"连接目标计算机失败");
    return;
    }

    else{

            pStatus->SetPaneText(0,"当前状态 :");
    SOCKET_STREAM_FILE_INFO2 StreamFileInfo;
    ::Sleep(20);
    sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO2));
    ////////////////////////////////////////////////////////
    //PROGRESS
    CProgressCtrl m_Progress;
    RECT MyRect;
    pStatus->GetItemRect(1, &MyRect); 

    m_Progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, MyRect, pStatus, 1);


    m_Progress.SetRange(0,(short)StreamFileInfo.nFileSizeLow); 
    m_Progress.SetPos(0);
    m_Progress.SetStep(5);
            ////////////////////////////////////////////////////

    CFile destFile(m_ProDir+StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

    UINT dwRead = 0;
    while(dwRead<StreamFileInfo.nFileSizeLow)
    {
    byte* data = new byte[2048];
    memset(data,0,2048);
    UINT dw=sockClient.Receive(data, 2048);
    destFile.Write(data, dw);
    dwRead+=dw;
    delete [] data;

    m_Progress.StepIt();
    }

    m_Progress.SetPos((short)StreamFileInfo.nFileSizeLow); 
    m_Progress.DestroyWindow();

    SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
    &StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);

    SetFileAttributes(m_ProDir+StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
    destFile.Close();
    sockClient.ShutDown();
    sockClient.Close();

    }
    }
      

  2.   

    我认真阅读了howtotell(touch)的代码,算是基本理清了你的思路。在服务器接受方:应该有一个BYTE *rFile类型的指针,用来Receic(rFile,nLength);然后在把这些二进制数据转化成文件储存起来。客户机发送方:应首先选中一个文件,然后把这个文件变成一个BYTE *rFile所指向的指针,最后在用这个指针发送出去:Send(rFile,nLength).但我还是有一些问题:
    1。在howtotell(touch)的代码中,
    sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
    这句代码把接受的数据存到StreamFileInfo对象中,这就是说,在发送端肯定也有
    一个
    sockClient.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
    而且在客户端肯定有一个对StreamFileInfo对象成员的附值,在传送过来以后。
    服务器端即刻调用void MyFSocketet::OnReceive(int nErrorCode)函数进行接受。在这个函数中,若用到
    sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
    在接受完这个类试于报头的的数据后,紧接着有调用了
    UINT dw=sockClient.Receive(data, 2048);
    ????能在OnReceive()中连用两次吗??是不是发送方也得发送两次??
    一次发文件信息,二次发文件本身。
    但是,客户方的Send()来到时,触发的是服务器方的OnReceive事件,但一个事件总有两个Receive()且类型,内容不同,程序难道能自动的实现:
    Send(&StreamFileInfo)时Receive(&StreamFileInfo)来接受;
    Send(rFile)时Receive(&StreamFileInfo)来接受?????
    各位高手在帮我解答一下吧!!!!!!!!