设为首页 加入收藏

TOP

VC++网络编程-文件传输
2013-05-03 18:11:15 来源: 作者: 【 】 浏览:51
Tags:网络编程 文件 传输

  在SOCKET编程(www.cppentry.com)中,以前学习的时候都是简单的字符传输,而在实际的应用中,经常需要传输文件,其实网络上的文件传输都是先把数据转化为字节流,当然,最底层的是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);

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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC获取默认浏览器 下一篇VC界面开发

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: