用indy udp server 接收,为什么客户端 发两次才能收到 一次?(0分)

  • 主题发起人 主题发起人 zad
  • 开始时间 开始时间
Z

zad

Unregistered / Unconfirmed
GUEST, unregistred user!
我用indy udp server 接收,为什么客户端 发两次才能收到 一次?而且,第一次、第三次、第五次。。。接受的数据丢掉了 ?

procedure Tmainform.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s,substring,ip,view: String;
k,i,port,rlength:integer;
rrbuf,ssbuf:array[1..30] of byte;
begin
rlength:=adata.size;
udpserver.ReceiveBuffer(rrbuf,rlength,ip,port,-1);
edit1.Text:=abinding.PeerIP;
for i:=1 to rlength do
begin
view:=view+inttohex(rrbuf,1)+'_' ;
end;
udpmemo.lines.add(view);
view:='';
end;

请大家帮帮忙!我的分用光了.
 
好像应该从adata流中读取数据,你进入这个程序的前提是adata中有数据了,
如果你用reacbuf读的话,就抛弃了adata重新去读程序,你看一下indy附带的
demo,好像有例子。我是这样做的
procedure Tdm.udpBrocastUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
myhead:AllHead;
mysize:integer;
recvbuf:SRecvedByRop;
begin
mysize:=sizeof(myhead);
AData.ReadBuffer(myhead,mysize);
AData.Position:=0;
AData.ReadBuffer(recvbuf,AData.Size);
ostate.SendMsgToshow('receive from '+Server+' data;func=53');
end;
我觉得你主要是recvbuf用错了地方
 
如果传递的是文字的话还可以偷懒,使用tstringlist.loadfromstream就可以啦,我就是这么做的,局域网里面很有意思,测试了几千次,一个包都没有丢。id还可以支持2k以上的udp数据,呵呵,很不错
 
后退
顶部