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

来源:互联网 发布:大数据采集软件有哪些 编辑:程序博客网 时间:2024/06/07 10:18

在SOCKET编程中,以前学习的时候都是简单的字符传输,而在实际的应用中,经常需要传输文件,其实网络上的文件传输都是先把数据转化为字节流,当然,最底层的是01二进制数据的传输,但是这部在我们讨论范围之内,其实现在还只是研究小文件怎么传输,当文件很大时,需要用到断点续传。

好了,要传输文件,首先先要计算出服务器端文件的大小,然后打开数据,读入到缓冲区中,首先发送文件的大小给客户端,然后客户端根据收到的文件大小,重新建立文件。

服务器端代码如下:

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);//关闭文件


客户端代码如下:

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 filedata,                // data buffernDatalen,     // number of bytes to write(LPDWORD)&nDatalen,  // number of bytes writtenNULL        // overlapped buffer);


 

或者客户端重建文件的代码如下:

FILE *fp = fopen("recv.rar","w+b");fwrite(data,nDatalen,1,fp);fclose(fp);


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