我也不知道是不是我的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彻底失望了
这么简单的问题都没人回答,我对csdn彻底失望了
#4
注意下,本地的RemoteHost对应远地的LocalPort
本地的LocalPort对应远地的RemoteHost
先看看这里有没有设置错误
本地的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绝望的话,要绝望首先要对自己绝望!
呵呵
procedure TForm1.FormCreate(Sender: TObject);
begin
NMUDP1.LocalPort := 5678;
NMUDP1.RemoteHost := 'localhost';
NMUDP1.RemotePort := 4567;
end;
你发送消息使用的是LOCALPORT,但是接受的使用的是REMOTEPORT,两个端口不一定要一样!
最好不要说什么对CSDN绝望的话,要绝望首先要对自己绝望!
呵呵
#7
大哥,我接受消息不是这个程序,端口当然不一样了。你没看明白我的意思。
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?
#8
我建议你把exe删掉,重新编译,我以前有时也会碰到这种怪问题
#9
1. 你有没有检查 receivedata 是什么东东?(虽然NumberBytes=-1)
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?
#10
to zhujunfeng:我在好几台电脑上试过,都一样。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
而且我本没开4567断口,当然不会发信息给fromport。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
而且我本没开4567断口,当然不会发信息给fromport。
#11
我测试了一下,其实这是UDP的一种通信机制。
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.
#12
UDP通信和TCP通信还是有区别的,它是无连接的。你要发的目标机器不存在也不会
出现InvalidHost事件!
出现InvalidHost事件!
#13
to hawksoft(明月清风):我认为的和你说的一样,一直就在等人说这个答案呢,呵呵,给分了/
#1
哎,真是求人不如求己,怎么我的问题就没人理过呢?
#2
兄弟别急,帮你up
#3
谢谢你的up,我会报答你的:)
这么简单的问题都没人回答,我对csdn彻底失望了
这么简单的问题都没人回答,我对csdn彻底失望了
#4
注意下,本地的RemoteHost对应远地的LocalPort
本地的LocalPort对应远地的RemoteHost
先看看这里有没有设置错误
本地的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绝望的话,要绝望首先要对自己绝望!
呵呵
procedure TForm1.FormCreate(Sender: TObject);
begin
NMUDP1.LocalPort := 5678;
NMUDP1.RemoteHost := 'localhost';
NMUDP1.RemotePort := 4567;
end;
你发送消息使用的是LOCALPORT,但是接受的使用的是REMOTEPORT,两个端口不一定要一样!
最好不要说什么对CSDN绝望的话,要绝望首先要对自己绝望!
呵呵
#7
大哥,我接受消息不是这个程序,端口当然不一样了。你没看明白我的意思。
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?
我是说端口不一样居然自己的程序收到了自己发来的消息!
你没有过提出n个问题从来没有一个被人回答出来的时候吗?
#8
我建议你把exe删掉,重新编译,我以前有时也会碰到这种怪问题
#9
1. 你有没有检查 receivedata 是什么东东?(虽然NumberBytes=-1)
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?
2. 你可不可以保证机器在 4567 这个端口接收到消息的时候,怎样都不会发回信 息给 from port ?
#10
to zhujunfeng:我在好几台电脑上试过,都一样。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
而且我本没开4567断口,当然不会发信息给fromport。
to yx_elee:numberbyte=-1的时候怎么检查receivedata啊,我不知道啊?
而且我本没开4567断口,当然不会发信息给fromport。
#11
我测试了一下,其实这是UDP的一种通信机制。
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.
如果RemoteHost不符合IP规范就会激活InvalidHost事件.
如果RemoteHost不存在(没开机)没反应。
如果RemoteHost存在,但RemotePort不存在则返回一条信息,按原发送端口回。
如果RemoteHost,RemotePort都存在,也不会出现你所列的现象.
#12
UDP通信和TCP通信还是有区别的,它是无连接的。你要发的目标机器不存在也不会
出现InvalidHost事件!
出现InvalidHost事件!
#13
to hawksoft(明月清风):我认为的和你说的一样,一直就在等人说这个答案呢,呵呵,给分了/