我用NMUDP写了一个局域网内的聊天小程序,存在一个奇怪的问题,我可以给自己发送消息,但是不能给局域网内的别的机器发送消息,但是,如果我在两台机器上先分别给自己发送消息(可以发送成功),然后在互相发送消息,就可以发送成功了,也就是说,必须先给自己发送一条消息后才可以发送消息给别的机器,请教高手这是什么原因,我跟踪代码,发现是TNMUDP空间的OnDataReceived事件时如下代码出现错误:procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var
  MyStream: TMemoryStream;
  MyReciveTxt: String;
begin
  MyStream := TMemoryStream.Create; {建立流}
  try
    NMUDP1.ReadStream(MyStream);{接收流}   ----》出错!!!
    SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数}
    MyStream.Read(MyReciveTxt[1],NumberBytes);{读数据}
    //MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt);
    MsgHistory.Lines.Add(MyReciveTxt);
  finally
    MyStream.Free; {释放流}
  end;
end;

解决方案 »

  1.   

    我估计是这样的,因为NMUDP的remotehost等都是可以变得,受的时候也有乱收的现象,就是你可能自己的程序收到自己程序发的东西,导致不同fromip的数据一起进来了,这样的混乱会导致NMUDP1.ReadStream(MyStream);{出错,
    解决方法
    begin
    这里加
      
    if NumberBytes<=0 then
         return;
    这样就可以避免自己收自己,因为这时NumberBytes=-1;
    我的经验是这样的,如果可以确定,最好是NumberBytes<=0或Port!=9999或FromIP!=NMUDP1.RemoteHost都跳出接收