H
hksoobe
Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TFrmMain.TransFile(filename:String); //这是一个分块接收文件函数Const BlockLen=1024*4; //缓冲区大小var Ftrans:File of Byte; //要收的文件 Recelen:Integer; //收到的分块大小 BlockBuf:Array[0..BlockLen-1] of Byte; //缓冲区 ReceSocket:TSocket; ra:SOCKADDR_IN; ra_len:Integer;begin Ra_len:=sizeof(Ra); ReceSocket:=accept(Server,@ra,@ra_len); AssignFile(Ftrans,filename); ReWrite(Ftrans); StopTrans:=False;//停止发送文件 InTrans:=True;//正在发送文件 Recelen:=recv(ReceSocket,BlockBuf,BlockLen,0);//先接收一个文件分块 while (Recelen>0) and (not StopTrans) do //接收分块再循环写入文件 begin BlockWrite(Ftrans,BlockBuf[0],Recelen);//这里我就不明白了,具体如最下面 Application.ProcessMessages; Recelen:=recv(ReceSocket,BlockBuf,BlockLen,0); end; if StopTrans then begin CloseFile(Ftrans); closesocket(ReceSocket); InTrans:=False; MessageBox(Handle,'停止传输!','提示',MB_OK); Exit; end; CloseFile(Ftrans); closesocket(ReceSocket); InTrans:=False; if (Recelen=SOCKET_ERROR) then MessageBox(Handle,'传输异常终止!','提示',MB_OK) else MessageBox(Handle,'客户端已经关闭连接!文件可能已经传送完毕!','提示',MB_OK)end;ps:那里收到一个文件分块再用,再用BlockWrite写入文件中,一个一个分块用While do写入文件中我也知道,但是问题就在这里我就不明白它又没指定文件写入的位置,它怎么知道这个文件上次的分块写到哪个位置了,它会接着下面再写入文件,难道BlockWrite函数会自动记录上次写到哪个文件位置了再接着写下去,还有BlockRead也是我就不贴出发文件函数了,那也一样它难道也知道,从文件中按分块大小一个一个读出指定的分块是从哪个位置开始,上次读到哪个位置,这次再接着读出来?不知道我说的清不清楚,大家有没有明白我的意思,我看到这两个函数都有四个参数,最后一个参数是什么意思啊!难道这个参数就是这个可以自动记录的原因所在吗?