用IdUDPClient和IDUDPServer传文件的的丢包问题 ( 积分: 200 )

  • 主题发起人 主题发起人 gw820522
  • 开始时间 开始时间
G

gw820522

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做个简单的点对点局域网聊天和发送文件的工具,用IdUDPClient和IDUDPServer实现,但找不到简单实用检测丢包问题解决方法,请大家帮忙,分不够要可以再加,一定要简单实用,我是个初学者,代码复杂了看不懂,谢谢
 
UDP没有流量控制,所以要丢包。最简单不丢包的方法是,发送方发送完一个数据包后,先停止发送,等待对方已经完全接收并发回确认信息,然后发送方才重新发送下一个包。这就是停止等待协议。这种方法效率低。要想提高发送效率,就要采用滑动窗口了,一两句话说不清楚。
 
您能告诉我
client.ReceiveString()
这个方法里面的参数的详细内容吗?有两种重载,如:
var
st1,st2:String;
begin
st1:=client.ReceiveString(300);
st2:=client.ReceiveString('10.100.143.65',5566,300);
//像上面这样写有错误吗?为什么每次都是返回 '' ,最后那个300到底是什么意思,该怎样写?
end;

//另外在idudpserver的UDPRead方法中,
procedure TForm1.serverUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
recd:rec;
begin
adata.ReadBuffer(recd,sizeof(recd));//取数据
abinding.Send(); //这个方法里的参数都代表什么意思
abinding.SendTo();//这个方法里的参数都代表什么意思
end;

帮我解决这些问题,我所有的分都送给您,谢谢!
 
在线等,请各位高手帮忙,我有300分,帮忙回答了全部相送
 
可以加个包头,其中包括 包序号,数据校验码,数据长度等信息。

在双方确要发送数据后, 发送方只管发就可以。发送完后,接收方检测现在的数据情况,向对方说明自己的缺包情况,向其要求重发。 不断重复。

这个办法的缺点是数据很大,网络很差的话,效率N低。 解决办法是发送方只发送一部分文件,等待接收方的完全确认后才开始发送下一部分文件。
 
st1:=client.ReceiveString(300);
st2:=client.ReceiveString('10.100.143.65',5566,300);
这里的300是接收等待时间,也就是最多等300毫秒的时间,如果在300毫秒以内接收到数据就很快返回,否则等了300毫秒还没有接收到数据的话就不再等了。你可以把这个数给大一些,如5000.

abinding.Send(); //这个方法里的参数都代表什么意思
abinding.SendTo();//这个方法里的参数都代表什么意思
答:function Send(var Buf; len: Integer; flags: Integer): Integer;
Buf是你要发送的数据,len是长度。flags标志选项。
如果发送聊天的字符串:
S := Edit1.Text;
abinding.Send(Pointer(S)^, Length(S),MSG_OOB);

如果发送文件:
var Buf:pointer;
F : TFileStream;
L:integer;
begin
F := TFileStream.Create('a.jpg',fmOpenRead);
getMem(buf, 2048);

....

L :=F.Read(Buf^,2048);
abinding.Send(Buf^,L,MSG_OOB);
.......

end;

SendTo与Send相似,需要指定IP与PORT
 
谢谢,请接分
 
后退
顶部