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("接收完毕!");
    }

  • 相关阅读:
    图解Python 【第八篇】:网络编程-进程、线程和协程
    TCP协议三次握手、四次挥手过程
    OSI七层模型与TCP/IP五层模型
    TCP/IP协议分为哪四层,具体作用是什么。
    app测试中,ios和android的区别
    APP在用户设备发生crash,应该怎么修复
    Android四层架构
    安卓四大组件、六大布局、五大存储
    测试工程师准备找工作,需要准备什么?
    接口测试响应码解析
  • 原文地址:https://www.cnblogs.com/lishennan/p/4624232.html
Copyright © 2011-2022 走看看