文件按指定多少大小分块传送问题
我现在将文件通过网络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呢