一个较难的问题,如何实现网络唤醒?重金200分!!谢绝灌水!(200分)

  • 主题发起人 only you
  • 开始时间
cow,明天就试一下。有人出主意,总要有人实践。
 
试验不成功。不是理论不行,看来是我的硬件不行。下载amd的程序也不行。
也看了amd的说明,跟温柔一刀说的一样,并非技术秘密,在包的任何部分出现相应编码都可,
所以用delphi自带的udp控件实现应没有问题。
 
问题的关键在这里:如何在UDP包中写入这段数据!没研究过这个问题,因为这段编码很多人知道,
但是这种软件却少的很,是大多数人不屑做这种尝试还是另有的别的原因,就我而言,显然是水平
不够,我所想见到的是如何实现,我的论点已经反复说过了,如果是用别人的软件实现,又如何
算是一个"较难的问题"呢?反过来,如果我实验成功又何必到这里来寻求答案!我已经再次说明,
不知道我有什么奇谈论调惹温柔兄如此不满,难道想知道具体的实现有什么错吗?好吧,我现在
告诉你们,用SOCK实现或ICMP,带上这段代码就行了!你们会了吗?简单的告诉别人用什么控件实
现和告诉别人用AMD的软件做的唯一区别就是一个东西是DELPHI的而且只是一个可以发送IP包
的控件.我不知道这算不算"实现的方法".难道一定要我说:请将代码贴上来!才算我是在问大家
如何现吗?无谓的辩论只是在浪费时间,温柔兄向不以灌水自居,但这此所说的内容中那一句不
是在含糊其词呢?可能我言中了,但是你能否认吗?(以下省去10000字)...............

呼!终于发完牢骚了,切入正题吧!如何在IP包中带上这段编码?(恐怕这句总算没有人误解了)



 
唉!不明白,实在是不明白,不过也不知道是你不明白还是我不明白,
上面老dai已经“试验”了,说明我说的话不是没有人能听懂吧?
我在此所说的内容那一句是含糊其辞呢?实在还请不吝赐教。

至于源程序,实在是因为我不知道应该怎么贴,就贴一段吧,希望大家看了不要笑掉大牙

var
str:string;
i:smallint;
begin
str:=stringofchar(#255,6);
for i:= 0 to 15 do
str:=str+chr($8b)+chr($A8)+chr($8a)+chr($33)+chr($00)+chr($09);
UDPSend(str,'192.168.0.255');
end;

UDPSend是伪码,含义应该很明显,使用支持UDP的控件或者用API,怎么都行。

我想这段程序你绝不可能由于“水平不够”而写不出来的,主要还是你想到别的地方去了,
总抱着你原来的那个观点,认为要加到特殊位置中,才能...,我说的对么?

如果我的过错在于我没有说清楚“把这段代码拼成字符串发送出去”的话,
那么又归结到我的表达能力问题了,可我真不知道这是不是我的错。

我自信上面的所有贴子都是在认认真真的进行讨论,并且没有违背我的风格,
如果你还觉得怒火难消,那么随便请几个大富翁的网友来看看这个贴子,
让他们说说那“以下省去”的1000字吧...
 
其实我也知道only you的意思,他担心用delphi的udp发送字符串,而其实实际的ip包是在
字符串中插入了其它的编码,如updsend(#FF#FF#FF#FF#FF#FF),而实际ip包中却是
#FF#FF#AA#FF#FF#AA#FF#FF#AA之类,对吗?
我也想试验通过再说的,但没办法,硬件不支持,amd的软件也不行,所以实在没办法试验成功。
但是,upd到底发送了什么,可用监控软件看一看呀。
正在准备下载监控软件。
 
>>如updsend(#FF#FF#FF#FF#FF#FF),而实际ip包中却是#FF#FF#AA#FF#FF#AA#FF#FF#AA之类,对吗?
是的,你的担心是人之常情,我原来也这么担心过,后来一想,
这个问题是不可能存在的,否则TCP/IP如何发送二进制数据呢?

不过我还是作了试验,确认确实没有这个问题。

>>正在准备下载监控软件
呵呵,监控软件是应该下载一个,不过不是单独为了试验这个就好 :)
 
下载AMD的程序,试了!the romote computer can start,Done,OK。
 
Hi, weicong,so would you please try the code I mentioned above?
thx.
 
老刀,介绍一个监控软件吧。当然要用到其他很多地方。
 
最好的当然是netxray,其他的我也没用过
 
不错,我们的讨论渐入正题,我正是担心发出的字符串编码会被变成其它的二进制编码而不是我
原来的数据,所以我根本就没有考虑用字符串的形式,我考虑的是先创建一个内存区域,然后
向这个内存区域写入以上编码,内存区域就用MemoryStream好了!我觉得这样保险一点,不过我
看了以上网友的发言决定两种方式都试试。与温柔的争论就暂告一段落吧,毕竟我们的目的是
讨论问题而不是搞是非大辩论。daiqingbo的论点和我一样,这篇帖子竟然惹这么多人的讨论我
感到实在太高兴了!看来不是大富翁没有高手,而是通常找不到一个共同点的问题。希望我们
所做交流,温柔兄不要太生气,毕竟我们是在讨论问题,谢谢的你的代码,希望你继续发表高见!
 
"我正是担心发出的字符串编码会被变成其它的二进制编码而不是我
原来的数据。"
only you 似乎多虑了,如果你用Tudp发送一段字符,注意尽量小些不要大于win的
最小分片(2k?)。然后flush,到目的网段上就会出现包含这段字符的mac包。不会有任何编码。
mac包的形成是把ip包(假设不分片)直接放到mac的结构中。而不会对
ip包编码后放入。
 
那就是说目的机不需要单独为这段编码的接收打开一个本地端口了,是由网卡直接接收了对吗?
请指教!
 
上面是802.3/2的对ip的封装。
如果是串行线路:slip或ppp,会对ip包作转义字符插入处理
slip:
因为0xC0(END),0xDB(ESC)是预定义的,所以在ip包中遇到这两个特殊字符就特殊处理
OxC0->0xC0+OxDC
0xDB->OxDB+0xDD
ppp:
标志字:0x7E
转义字:0x7D
0x7e->0x7D+0x5E
0x7D->0x7D+0x5D
为防止moden对字符发生误解,所有<0x20的字符也要作转义,第6位取补码然后在前面加上
0x7D

0x01->0x7d+0x21 (就是对0x01的第6位取补码)


 
确定不用打开什么本地端口 别忘了你的系统还没启动啊
在我看了一刀前面的话和你的帖子 有很多不能肯定 所以一直不敢发言
一刀是针对以太网802.3说的以太网包
only you 是指通过moden的串行线路。
这里的包格式不一样。
按我的理解用ppp协议封装的包就不会出现08 65 88 a0 00 38 !
我要晕倒了这里必然要用转义字符。。。。。。。。。。。。。。。。
 
我也同意,我们确实开始进入正题了:

>>那就是说目的机不需要单独为这段编码的接收打开一个本地端口了,是由网卡直接接收了对吗?

对,因为目的机根本没有开机,不存在接收的问题。
只是网卡在流经网络的以太网包中监测到了这段代码,就去唤醒计算机了。
所以实际上用IPX/Netbeui等等任何协议都可以,只要包中完整包含这段代码。
这就是为什么我前面的那句话是:
“向局域网发送广播包(可以用UDP),内容带上这段编码就可以了”
^^^^
我每一句话其实都是深思熟虑的,决非含糊其辞,这下你是不是可以体会一下我的感受了?

同时,作为协议的创立者,必须要考虑到极为复杂的网络情况,
包的长度要有一定限制,而且内容又要绝对的无歧义,因此就定下了FF*6+MAC*16这么个怪东西 :)

ps:g622,你开始跑题了? ^_*
 
一刀 如果是以太网 我很同意你的观点
但我在想用moden的“远程”唤醒 因为那是通过ppp线路的情况
(当然交给ip层后就都一样了 但和前面的说法 mac包怎么统一?请指教)

 
实验成功,如下代码,大家参考!
procedure TForm1.Button1Click(Sender: TObject);
var
SendCode:string;
TempStr:string;
i:byte;
begin
SendCode:=StringofChar(#255,6);
for i:=0 to 15 do
begin
TempStr:=TempStr
+string(char($00))
+string(char($50))
+string(char($BA))
+string(char($EC))
+string(char($71))
+string(char($A6));
end;
SendCode:=SendCode+TempStr;
UDPSend(SendCode);
end;
procedure TForm1.UDPSend(SendCode: String);
var
SendMStream:TMemoryStream;
begin
SendMStream:=TMemoryStream.Create;
try
NMUDP1.ReportLevel:=1;
NMUDP1.RemoteHost:='188.0.255.255';
NMUDP1.RemotePort:=7010;
SendMStream.Write(SendCode[1],length(SendCode));
NMUDP1.SendStream(SendMStream);
finally
SendMStream.Free;
end;
end;


 
天呐!问题竟然如此简单,为什么?(造化能人!!)
可是我只有在进入98后关机的状态下才起作用,而下列状态将没有任何反应,今天老板不在,
就偷一次懒吧,与大家痛快的讨论一会。
1.处于休眠状态时
2.nt下直接关闭电源时!
 
ppp的试验你是否也可以作一下?
可怎么获得mac地址啊 是不是只能在802.3下实现?
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部