zoukankan      html  css  js  c++  java
  • VC中文件传输

    思路:

    服务端

    1.首先文件已二进制打开;2.把文件的属性传送给客户端;3.以字节的形式读取文件中的数据,并循环发送给客户端直到发送完毕。

    客户端

    1.收取服务器端发送而来的文件信息,并创建相应文件;2.把服务器发送而来的数据信息按字节形式写入 该文件中;3.设置文件的一些属性。

    相应代码:

    数据结构:

    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 CServerDlg::OnButtonLicsen()
    {
    // TODO: Add your control notification handler code here
    CFileDialog Dlg(TRUE);
    if(Dlg.DoModal()!=IDOK)
    return;

    CFile myFile;
    if(!myFile.Open(Dlg.GetPathName(), CFile::modeRead | CFile::typeBinary))
    {
    AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
    return;
    }

    CSocket sockSrvr;
    sockSrvr.Create(800);

    sockSrvr.Listen();
    CSocket sockRecv;
    sockSrvr.Accept(sockRecv);

    SOCKET_STREAM_FILE_INFO StreamFileInfo;
    WIN32_FIND_DATA FindFileData;

    FindClose(FindFirstFile(Dlg.GetPathName(),&FindFileData));
    memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
    strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());

    StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
    StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;
    StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
    StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
    StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
    StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow;

    sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));

    UINT dwRead=0;
    while(dwRead<StreamFileInfo.nFileSizeLow)
    {
    byte* data = new byte[1024];
    UINT dw=myFile.Read(data, 1024);
    sockRecv.Send(data, dw);
    dwRead+=dw;
    if (data!=NULL)
    {
    delete[]data;
    data=NULL;
    }
    }
    myFile.Close();

    sockRecv.Close();
    AfxMessageBox("发送完毕!");
    }

    客户端:

    void CClientDlg::OnButtonSend()
    {
    // TODO: Add your control notification handler code here
    BROWSEINFO bi;
    char dispname[MAX_PATH], path[MAX_PATH];
    ITEMIDLIST * pidl;
    bi.hwndOwner = 0;
    bi.pidlRoot = 0;
    bi.pszDisplayName = dispname;
    bi.lpszTitle = "选择文件夹";
    bi.ulFlags = BIF_RETURNONLYFSDIRS;
    bi.lpfn = 0;
    bi.lParam = 0;
    bi.iImage = 0;
    if (pidl = SHBrowseForFolder(&bi))//弹出文件夹浏览窗口,并选取目录
    {
    if( SHGetPathFromIDList(pidl, path) == TRUE )
    {

    }
    else{return;}
    }

    AfxSocketInit(NULL);
    CSocket sockClient;
    sockClient.Create();

    CString szIP;
    GetDlgItemText(IDC_EDIT_IPADDRESS,szIP);

    if(!sockClient.Connect((LPCTSTR)szIP, 800))
    {
    AfxMessageBox("连接到对方机器失败!");
    return;
    }


    SOCKET_STREAM_FILE_INFO StreamFileInfo;
    sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));

    CString strTmp=StreamFileInfo.szFileTitle;
    CString strPath=path;
    strPath+="\";
    strPath+=strTmp;
    strcpy(StreamFileInfo.szFileTitle,strPath.GetBuffer(strPath.GetLength()));
    CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

    UINT dwRead = 0;
    while(dwRead<StreamFileInfo.nFileSizeLow)
    {
    byte* data = new byte[1024];
    memset(data,0,1024);

    UINT dw=sockClient.Receive(data, 1024);
    destFile.Write(data, dw);

    dwRead+=dw;
    if (data!=NULL)
    {
    delete[]data;
    data=NULL;
    }
    }

    SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
    &StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
    destFile.Close();
    SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
    sockClient.Close();
    AfxMessageBox("接收完毕!");
    }

  • 相关阅读:
    Linux学习进阶路线图
    Ubuntu打开终端的方法三种
    Linux下显示IP地理位置信息的小工具-nali
    kail2 linux 安装vmware tools
    Ubuntu下apt-get命令详解
    Eclipse安卓开发环境
    纪念逝去的计算器之计算表达式结果
    今年暑假要AC
    结课博客作业
    第七次课程作业
  • 原文地址:https://www.cnblogs.com/lishennan/p/4624232.html
Copyright © 2011-2022 走看看