神啊 救救我吧。。。。。。(网络编程 有点难)
传送大文件(50M)的时候就出错(在文件传送一半的时候出错),在服务器端出现'winwods socket error:(10022),on api recv'各位大虾帮我诊断一下。
客户端:
procedure Tfrm_client.sb_sendClick(Sender: TObject);
const blocklen=1024*4;//一次传送4k
var blockbuf:Array[0..blocklen-1] of Byte;
blocknum,remainlen,flen,i:Integer;
sendf:TFileStream;
begin
sb_stop.Enabled:=true;
sendf:=TFileStream.Create(d:\data.db,fmOpenRead);
flen:=sendf.Size;//文件大小
blocknum:=flen div blocklen;//判断要循环几次
//是否有余下的数据
remainlen:=flen mod blocklen;
stop_trans:=False;
in_trans:=True;
sendlen:=1;
try
sendf.Seek(0,soFromBeginning);
for i:=0 to blocknum-1 do
begin
if (stop_trans)or(sendlen<=0)then
break;
sendf.Read(blockbuf,blocklen);
sendlen:=client.Socket.SendBuf(blockbuf,blocklen);pb_client.Position:=i;
//给程序一定处理时间
application.ProcessMessages;
end;
//判断分块完成后,是否有余下的数据还没有被传送
if remainlen>0 then
begin
sendf.Read(blockbuf,remainlen);
sendlen:=client.Socket.SendBuf(blockbuf,remainlen);
end;
//更新显示
//收尾工作
in_trans:=False;
sb_send.Enabled:=False;
MessageBox(handle,'传输完成!','提示',mb_ok);
finally
sendf.Free;
end;
server端
procedure Tfrm_server.serverClientRead(Sender: TObject;
Socket: TCustomWinSocket);
const blocklen=1024*4;
var
recelen:Integer;//接收长度
recef:TFileStream;
blockbuf:Array[0..blocklen-1] of Byte;
begin
recef:=TFileStream.Create(e:\data.db,fmcreate);
recelen:=Socket.ReceiveBuf(blockbuf,Socket.ReceiveLength);
while recelen>0 do
begin
recef.WriteBuffer(blockbuf,recelen);
application.ProcessMessages;
recelen:=Socket.ReceiveBuf(blockbuf,Socket.ReceiveLength);
end;
recef.Destroy;
Socket.Close;
end;