VC++网络编程-文件传输

来源:岁月联盟 编辑:exp 时间:2012-09-27

在SOCKET编程中,以前学习的时候都是简单的字符传输,而在实际的应用中,经常需要传输文件,其实网络上的文件传输都是先把数据转化为字节流,当然,最底层的是01二进制数据的传输,但是这部在我们讨论范围之内,其实现在还只是研究小文件怎么传输,当文件很大时,需要用到断点续传。
好了,要传输文件,首先先要计算出服务器端文件的大小,然后打开数据,读入到缓冲区中,首先发送文件的大小给客户端,然后客户端根据收到的文件大小,重新建立文件。
服务器端代码如下:
[cpp]
HANDLE hFile;  
 
        hFile = CreateFile(_T("D://学习资料//复试上机题目.rar"),           // open MYFILE.TXT  
            GENERIC_READ,              // open for reading  
            FILE_SHARE_READ,           // share for reading  
            NULL,                      // no security  
            OPEN_EXISTING,             // existing file only  
            FILE_ATTRIBUTE_NORMAL,     // normal file  
            NULL);                     // no attr. template  
 
        if (hFile == INVALID_HANDLE_VALUE)  
        {  
            AfxMessageBox(_T("Could not open file."));   // process error  
        } 
 
        DWORD dwFileSize = 0; 
        dwFileSize = GetFileSize(hFile,NULL); 
        byte *pBuffer = new byte[dwFileSize]; 
        DWORD dwReadSize = 0;               //文件长度 
        ::ReadFile(hFile,pBuffer,dwFileSize,&dwReadSize,NULL); 
        send(sockConn,(const char*)&dwReadSize,4,0);    //发送文件长度 
        send(sockConn,reinterpret_cast<char *>(pBuffer),dwReadSize,NULL); //发送数据文件 
 
        CloseHandle(hFile);         //关闭文件 

客户端代码如下:
[cpp] 
int nDatalen = 0; 
    recv(sockClient,(char*)&nDatalen,4,0); 
    printf("%d/n",nDatalen); 
 
    byte *data = new byte[nDatalen]; 
    recv(sockClient,(char*)data,nDatalen,0); 
 
    HANDLE hFile;  
 
    hFile = CreateFile("recv.rar",           // open MYFILE.TXT  
        GENERIC_WRITE,              // open for reading  
        FILE_SHARE_WRITE,    // share for reading  
        NULL,                      // no security  
        CREATE_NEW,             // existing file only  
        FILE_ATTRIBUTE_NORMAL,     // normal file  
        NULL);                     // no attr. template  
 
    if (hFile == INVALID_HANDLE_VALUE)  
    {  
        printf("Could not open file.");   // process error  
    } 
 
    WriteFile( 
        hFile,                    // handle to file 
        data,                // data buffer 
        nDatalen,     // number of bytes to write 
        (LPDWORD)&nDatalen,  // number of bytes written 
        NULL        // overlapped buffer 
        ); 

 
或者客户端重建文件的代码如下:
[cpp] 
FILE *fp = fopen("recv.rar","w+b"); 
    fwrite(data,nDatalen,1,fp); 
    fclose(fp); 

但是,就目前的这代码,还只适合传输数据量比较小的文件,当文件比较大时,就不能忍受了,所以就必须研究断点续传,以后研究吧。本文只适合初学者,大牛们就当是小说。这只是最基本的传输代码,后面会逐步完善。