谁用过NMDUP看看有没有遇到过这个奇怪的问题?

时间:2022-04-08 20:54:16

我也不知道是不是我的delphi有问题,但是我在别人机器上调试也有这样的问题---我们装的是一张盘上
的delphi6。
问题是这样的:
新建一个project,在form1上放一个NMUDP控件和一个Button控件,然后写了下面的代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NMUDP, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    NMUDP1: TNMUDP;
    procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
      FromIP: String; Port: Integer);
    procedure Button1Click(Sender: TObject);
    procedure NMUDP1StreamInvalid(var handled: Boolean; Stream: TStream);
    procedure NMUDP1InvalidHost(var handled: Boolean);
    procedure NMUDP1DataSend(Sender: TObject);
    procedure NMUDP1BufferInvalid(var handled: Boolean;
      var Buff: array of Char; var length: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);

begin
  showmessage('received');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  buff :string;
  send:tmemorystream;
begin
  buff := chr($03) + chr(13)+chr(00) + chr($09) + chr($02)+chr($00)+'jieson15000';
  send := tmemorystream.Create ;
  try
    send.Write(buff[1],length(buff));
    nmudp1.sendstream(send);
  finally
    send.Free ;
  end;

end;

procedure TForm1.NMUDP1StreamInvalid(var handled: Boolean;
  Stream: TStream);
begin
  showmessage('StreamInvalid');
end;

procedure TForm1.NMUDP1InvalidHost(var handled: Boolean);
begin
  showmessage('InvalidHost');
end;

procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
  showmessage('DataSend');
end;

procedure TForm1.NMUDP1BufferInvalid(var handled: Boolean;
  var Buff: array of Char; var length: Integer);
begin
  showmessage('BufferInvalid');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NMUDP1.LocalPort := 5678;
  NMUDP1.RemoteHost := 'localhost';
  NMUDP1.RemotePort := 4567;

end;

end.
运行之,在DataReceived的程序里加一个断点,按下button1,结果居然执行到了那个断点!
localport和remoteport明明不一样啊!
还有更奇怪的,把remotehost设置成网络上另外一台运行着的机器,运行时按下button1,居然
还能执行到DataReceived里,这时候看看DataReceived函数的参数FromIP,居然是我设置的那台机器
的ip!而那台机器没开的话,就会弹出invalidhost的对话框。
是不是如果机器的某个端口没开的话会返回个错误啊?因为上面说的时候在DataReceived函数里
NumberBytes=-1,就是说其实数据是没有发给自己的。
我就知道这么多了,不知道大家有没有遇到过这样的情况,请各位赐教!

13 个解决方案

#1


哎,真是求人不如求己,怎么我的问题就没人理过呢?

#2


兄弟别急,帮你up

#3


谢谢你的up,我会报答你的:)
这么简单的问题都没人回答,我对csdn彻底失望了

#4


注意下,本地的RemoteHost对应远地的LocalPort
        本地的LocalPort对应远地的RemoteHost
先看看这里有没有设置错误

#5


不是这的错误,我觉得是不是搜索远程的端口,如果没有的话会返回一个-1的numberbytes啊。应该是这样了。

#6


很简单的问题,你的设置
procedure TForm1.FormCreate(Sender: TObject);
begin
  NMUDP1.LocalPort := 5678;
  NMUDP1.RemoteHost := 'localhost';
  NMUDP1.RemotePort := 4567;

end;
你发送消息使用的是LOCALPORT,但是接受的使用的是REMOTEPORT,两个端口不一定要一样!
最好不要说什么对CSDN绝望的话,要绝望首先要对自己绝望!

呵呵

#7


大哥,我接受消息不是这个程序,端口当然不一样了。你没看明白我的意思。
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?

#8


我建议你把exe删掉,重新编译,我以前有时也会碰到这种怪问题

#9


1. 你有没有检查 receivedata 是什么东东?(虽然NumberBytes=-1)
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?

#10


to zhujunfeng:我在好几台电脑上试过,都一样。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
   而且我本没开4567断口,当然不会发信息给fromport。

#11


我测试了一下,其实这是UDP的一种通信机制。
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.

#12


UDP通信和TCP通信还是有区别的,它是无连接的。你要发的目标机器不存在也不会
出现InvalidHost事件!

#13


to hawksoft(明月清风):我认为的和你说的一样,一直就在等人说这个答案呢,呵呵,给分了/

#1


哎,真是求人不如求己,怎么我的问题就没人理过呢?

#2


兄弟别急,帮你up

#3


谢谢你的up,我会报答你的:)
这么简单的问题都没人回答,我对csdn彻底失望了

#4


注意下,本地的RemoteHost对应远地的LocalPort
        本地的LocalPort对应远地的RemoteHost
先看看这里有没有设置错误

#5


不是这的错误,我觉得是不是搜索远程的端口,如果没有的话会返回一个-1的numberbytes啊。应该是这样了。

#6


很简单的问题,你的设置
procedure TForm1.FormCreate(Sender: TObject);
begin
  NMUDP1.LocalPort := 5678;
  NMUDP1.RemoteHost := 'localhost';
  NMUDP1.RemotePort := 4567;

end;
你发送消息使用的是LOCALPORT,但是接受的使用的是REMOTEPORT,两个端口不一定要一样!
最好不要说什么对CSDN绝望的话,要绝望首先要对自己绝望!

呵呵

#7


大哥,我接受消息不是这个程序,端口当然不一样了。你没看明白我的意思。
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?

#8


我建议你把exe删掉,重新编译,我以前有时也会碰到这种怪问题

#9


1. 你有没有检查 receivedata 是什么东东?(虽然NumberBytes=-1)
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?

#10


to zhujunfeng:我在好几台电脑上试过,都一样。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
   而且我本没开4567断口,当然不会发信息给fromport。

#11


我测试了一下,其实这是UDP的一种通信机制。
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.

#12


UDP通信和TCP通信还是有区别的,它是无连接的。你要发的目标机器不存在也不会
出现InvalidHost事件!

#13


to hawksoft(明月清风):我认为的和你说的一样,一直就在等人说这个答案呢,呵呵,给分了/