敬业的IT人 >> 编程开发 >> C/C++ >> C++ Builder文件任意分割传输技术

C++ Builder文件任意分割传输技术

敬业的IT人 互联网 佚名 2008-1-3 19:38:16

  [摘要] 本文详细介绍了应用C++builder把文件任意分割成若干个小块在网络上发送并在终端上接收,重新组装成原文件的技术。
  一. 前言
  目前网络编程技术有很多,一般都是直接利用编程软件自带的功能函数或控件来完成,用户不必关心低层的操作,确实带来方便。但灵活性不够,如果要传输的文件比较大,则速度慢。如果网络的断线率高,则不得不重新传输。本程序可以克服以上不足,将任意大小的文件视网络状况在客户端分割成任意大小的数据流进行发送,在服务端接收数据流,并组装成原文件。如果网络被中断,则记下位置,待网络恢复后继续从断点的位置传输,终端继续接收,直到传输完毕。
  本程序在Windows2000调试通过,读者可以应用本程序的设计技术应用到其他网络通讯中去。
  二.建立程序框架
  新建一个工程存为tborder="0" alt="C++ Builder文件任意分割传输技术(图一)" width="288" height="193" />
  三.程序实现
  本程序是在客户端发送一个2M字节的BMP图片,终端接收和组装此图片并显示在Form的窗口中用于验证。本程序即可作为发送端,也可做接收端,只要在两台互联的计算机上运行即可。
  shi.cpp源文件如下:
#include
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
static int shi=0,emod=0,hui=0,x=0,a=0,i=0;
AnsiString filename;
file://---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TCompborder="0" alt="C++ Builder文件任意分割传输技术(图二)" width="252" height="194" />
(图2)发送前
C++ Builder文件任意分割传输技术(图三)
(图3)接收后显示

  
  file://以下函数用于任意分割文件和发送文件。
  void __fastcall TForm1::clientWrite(TObject *Sender,TCustomWinSocket *Socket)
  { void *p[20000];
   static long k=20000;//x=0;//hui=0;
   static long bmpsize,/*i=0*/c,mod;
   static TMemoryStream* pms = new TMemoryStream();
   if(hui==0){pms->LoadFromFile(filename);hui++;}//装入要发送的文件。
    bmpsize=pms->Size; file://计算文件的大小(字节)
    c=(int)bmpsize/k; file://分割文件为c
    mod=bmpsize%k; file://分割后于下的字节数
    emod=mod; file://使mod在整个程序都可访问
    if(i     {pms->Position=x; file://改变内存流读取指针
     pms->ReadBuffer(p,k); file://把内存流读入缓冲区,即改变流的类型
     x=x+k;
     client->Socket->SendBuf(p,k); file://将分割的文件发送
     i++; }
    else
    { shi++;
     if(shi==1)
      {pms->ReadBuffer(p,mod); file://发送最后mod个字节后,发送完毕
       client->Socket->SendBuf(p,mod); }}}

  //下面函数用于选择要发送的文件(*.bmp)
void __fastcall TForm1::Button2Click(TObject *Sender)
{ if(OpenDialog1->Execute()){
  filename = OpenDialog1->FileName;
  label->Caption="选择图片成功";
  hui=0; shi=0; a=0;
  x=0; i=0;}}
file://---------------------------------------------------------------------------


  由于在文件中要用到全局变量gan,所以要在unit.h的头文件中加入其定义,如下:
class TForm1 : public TForm
{private: …
TMemoryStream* gan;
…};
  四.技术关键
  把文件进行分割成一块一块的内存流,由于c++builder的套接字Socket在发送接收时是以缓冲区类型的为数据,因此需要把内存流转化成此类型数据传输。为了使在网络断线时保存断点,用了全局变量和函数内部的静态变量巧妙的解决了这个问题。保留:: 进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com