救命啊,一个晚上没搞定,文件传输的问题, (150分)

  • 主题发起人 主题发起人 coao
  • 开始时间 开始时间
C

coao

Unregistered / Unconfirmed
GUEST, unregistred user!
Server端接收

try
GetMem(BufRecv,iRecvLength+1);
Socket.ReceiveBuf(BufRecv^,iRecvLength);
fsRecv.WriteBuffer(BufRecv^,iRecvLength);
finally
FreeMem(BufRecv,iRecvLength+1);
end;
bReadText:=true;
// showMessage(inttostr(i));

if fsRecv.Size>=iFileSize then
begin
socket.SendText(MP_OVER);
fsRecv.Free;
iFileSize:=0;
end
else
Socket.SendText(MP_NEXTWILLBEDATA);


Click端

MP_DATA:
begin
Memo1.Lines.Add(sTemp+' 发数据');
try
// socket.SendStream(fsSend);
GetMem(bufSend,iBYTEPERSEND+1);
if (fsSend.Position+1+iBYTEPERSEND) <= fsSend.Size then
begin
fsSend.ReadBuffer(bufSend^,iBYTEPERSEND);
Socket.SendBuf(bufSend^,iBYTEPERSEND);
end //普通的发送,大小为iBYTEPERSEND
else
begin
fsSend.ReadBuffer(bufSend^,fsSend.Size-fsSend.Position);
Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position);

// fsSend.Read(bufSend^,iBYTEPERSEND);
// Socket.SendBuf(bufSend^,iBYTEPERSEND);
// showmessage(inttostr(fsSend.Position));

end; //最后一次发送,发送剩余的数据
Label1.Caption:=Label1.Caption+' '+inttostr(fsSend.Size);
finally
FreeMem(bufSend,iBYTEPERSEND+1);
end; { end try}

采用的是自定义传输协议,一问一答式的,传输包的大小定义为2K。

问题:客户端明明已发出数据,但服务器却不接收,
现象:当传输一个5K文件时,前2*2048可以接收到,后面就不接收了,也就是说客户端发了3次,
而服务端却只接收两次。

贴出的代码中,客户端注释部分可以发送整个文件,但却是比原文件还大,里面的内容好像是
复盖了前一包的地方,而多余的地方还是前一包的东东。:(
 

begin
socket.SendText(MP_OVER);
fsRecv.Free; //******不好立即执行
iFileSize:=0;
end
else
Socket.SendText(MP_NEXTWILLBEDATA);
 
TO:IIE

注释掉也是一样的效果。:(,因为那根本不执行。
 

begin
fsSend.ReadBuffer(bufSend^,fsSend.Size-fsSend.Position);
Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position);

// fsSend.Read(bufSend^,iBYTEPERSEND);
// Socket.SendBuf(bufSend^,iBYTEPERSEND);
// showmessage(inttostr(fsSend.Position));

end; //最后一次发送,发送剩余的数据

上面这段执行了吗
 
执行,而且我在检测到已发出缓冲区,就是最后一次发送字节的大小。
 

if (fsSend.Position+1+iBYTEPERSEND) <= fsSend.Size then

我没仔细看,感觉+1不应该有
 
好像没有用,加不加1对这段代码执行无影响。
 
TO IIE:
你的QQ是????

ME:6082316
 
那就更有问题了,这行语句是判断结束的呵,你再调一下试试
 
试过了,那段代码是执行的,

也就是最后一次的发送的成功的。
 
要不,我发程序给你看看???
 
temp := fsSend.Size-fsSend.Position;
fsSend.ReadBuffer(bufSend^,temp);
Socket.SendBuf(bufSend^,temp);
 
OK

thank you

改天请你吃饭,呵呵

 
IIE的QQ?

难道是winsocket的position有问题吗???那怎么前两次都可以呢????
 
接受答案了.
 
后退
顶部