首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

文件按指定多少大小分块传送有关问题

2012-02-08 
文件按指定多少大小分块传送问题我现在将文件通过网络clientscoket控件向服务器发送文件,比如一个小于4K的

文件按指定多少大小分块传送问题
我现在将文件通过网络clientscoket控件向服务器发送文件,比如一个小于4K的文件,直接一次传送掉,大于4K的文件,如:50K的文件,但我要将文件进行4K切分传送,每传4K字节后,将会收到服务器serversocket传过来“OK”确认指令,再进行下一个4K的传送,直到传完整个文件,我写了个代码,在clientSocket 读事件中收到OK指令后,就将全局标准变量赋1,然后在主程序中进行判断,标志位正确,则进行下一个4K的传输,但有问题,请各位指点一下,谢谢。

  int iFileHandle;
  int iFileLength;
  int iBytesRead;
  int position=0;
  int i;
  char *pszBuffer;


  iFileHandle = FileOpen("D:\\test.txt ",fmOpenRead);

  iFileLength = FileSeek(iFileHandle,0,2);
  Label3->Caption=IntToStr(iFileLength); //显示文件的大小字节数

  FileSeek(iFileHandle,0,0);
  pszBuffer = new char[iFileLength+1];

  if (iFileLength<4097) //如果文件小于4K字节,直接发送
  {
  FileRead(iFileHandle, pszBuffer, iFileLength);
  ClientSocket_Send(pszBuffer);
  }
  else
  { Form1->file_ok=1; //在FORM中的一个收到应答的标志变量,这个标志变量会在socket收到应答数据后置1
  while ( ((position=position+4096)<iFileLength)&&(Form1->file_ok==1) )
  {
  //position=position+4096;
  Form1->file_ok=0;
  FileSeek(iFileHandle,position-4096,0);
  iBytesRead = FileRead(iFileHandle, pszBuffer, 4096); //读4K文件
  ClientSocket_Send(pszBuffer); //发4K文件
  for (i=0;i<10;i++)
  {
  Sleep(100);//延时
  Application-> ProcessMessages();
  }

  }
  if (Form1->file_ok==1)
  {
  FileSeek(iFileHandle,position-4096,0); //发送零头文件
  iBytesRead = FileRead(iFileHandle, pszBuffer,iFileLength-position+1 ); //读4K文件
  ClientSocket_Send(pszBuffer);
  }
  }
   
  FileClose(iFileHandle);

[解决办法]
你应该在第一次传送开始的时候先把文件的长度传给接收端,接收的时候把接收的字节相加,判断文件是否传完.
[解决办法]
你的意思是不是你每次发文件的最后总是多发一次???那你检查你的发送的循环,是不是计算错了,比如你这里
position=position-4; FileSeek(iFileHandle,position-4,0); //发送零头文件
//ShowMessage(IntToStr(iFileLength-position));
这个地方为什么要减个4呢

热点排行