底层问题:怎么发送唤醒帧?

乘思者 2003-11-06 02:46:21
加精
有的网卡提供功能,可以远程唤醒,只要同一个硬件网内的机子发送一个唤醒帧就可以了,那么怎么用程序发送这个唤醒帧呢?(最好有C#源码)
...全文
343 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
激荡数十年 2004-02-03
  • 打赏
  • 举报
回复
http://www.depicus.com/wake-on-lan/files/WakeOnLanGui.zip
如果还不清楚,建议用GOOGLE搜索,关键词magic packet,以获得更多信息。
乘思者 2004-02-02
  • 打赏
  • 举报
回复
你有那个发送的软件嘛?可不可以传给我?
激荡数十年 2004-01-18
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////
//
// 选自 http://softuse.myrice.com/softuse/net/net/hanx.htm
//
// 网络开机原理
//
// 一、 如果要想通过网络唤醒一台指定的计算机,那 么就必须知道能标识该计算机
// 的身份号。由于被唤醒 的计算机处于关机状态,因此其内部的IP地址和计算
// 机名字也就消失了,唯一能标识其身份的只有其内 部网卡的物理地址,即MAC
// 地址。该地址是唯一的, 而且每块网卡的MAC地址均不相同。在知道被唤醒的
// 计算机MAC地址后,通过另外一台计算机运行相应的 软件,向网络上发出含有
// 该地址的特殊数据包。这 时,被要求唤醒的计算机虽然处于关机状态,但是其
// 内部网卡控制芯片通过专用联线所送来的电流,仍然 可以接受和处理网络上的
// 数据包,因此控制芯片通过 比较数据包内的MAC地址,就可确认自己就是该数
// 据包的收件者,然后通过专用联线发出开机信号,通知主板开机启动。
//
// 二、 硬件要求
//
//   网络唤醒开机必须有相应的硬件支持才行。首先 要有主板支持,现在新一代的
// 主板大都支持该功能, 而且在土板上有一个三脚插座,一般都在PCI插槽附近,
// 旁边标注“WOL”。其次网卡必须支持,这类网卡 在其板子上比一般的网卡多了
// 一个三脚插座,并且通 常还附带了一条专用的三芯联接线,该线就是用来连接
// 主板和网卡。最后还必须使用ATX电源,而且其+5V Standbv电流必须比较大,根
// 据Intel的建议规格, 需要600mA以上。该电流的大小可以从电源外部标识 中的
// +5VSB栏里查到。
//   须要说明的是,对于某些国外品牌机而言,比如 笔者所使用的AST-Premium98
// 计算机,因其主板上已 经集成了具有网络唤醒功能的网卡,所以没有什么三
// 脚插座,也不需要专用的三芯联线。
//
// 三、 软件要求
//
//   为了唤醒网络上的计算机,必须发出一种特殊的 数据包,该数据包的格式与普通
// 数据包不同,而且还 必须使用相应的专用软件才能产生。当前普遍采用的是AMD
// 公司制作的Magic Packedt1.O这套软件何 以生成网络唤醒所需要的特殊数据包,
// 俗称魔术包 (Magic Packet)。该数据包包含有连续6个字节的 “FF”和连续
// 重复16次的MAC地址。 Magic Packet格 式虽然只是AMD公司开发推广的技术,并
// 非世界公认 的标准,但是仍然受到很多网卡制造商的支持,因此 许多具有网络
// 唤醒功能的网卡都能与之兼容。
//

#include <windows.h>
#include <iostream>
using namespace std;

#pragma comment(lib, "ws2_32.lib")

typedef struct
{
BYTE Characters[6];
BYTE MACAdd[16][6];
} MagicPkg;

// 通过程序拼凑出魔术包,按UDP协议发送广播,实现远程唤醒功能。
//
// 注: 本人将发送的包和Magic Packet utility软件发送的包做过认真比对,
// 认为是一致的,具体是否正确,有待于验证,
// 如果有人证明我的程序有错或正确,麻烦告诉我本人,不甚感激。
//
// 作者:罗治凡
// QQ: 5337295; email: lzf_china@163.com; http://luozhifan.126.com
//
// VC6+SDK2000下编译通过(C#俺不懂,不过函数和参数应该与此类似)
//
BOOL WakeByLan()
{

// bMAC_Address:
// 待唤醒的主机MAC地址,如何获得在此略过,
// 不明了的朋友请参考有关NetBIOS编程文档
BYTE bMAC_Address[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
sockaddr_in saAdd = {0};
SOCKET sock = INVALID_SOCKET;
BOOL bBroadcast = TRUE;
BOOL bRet = TRUE;
int i, foo=1;
INT err;

MagicPkg pkg = {0xff,0xff,0xff,0xff,0xff,0xff};

for(i=0; i<16; i++)
{
memcpy(&pkg.MACAdd[i], bMAC_Address, sizeof bMAC_Address);
}

sock = socket ( AF_INET, SOCK_DGRAM, IPPROTO_IP );

if ( INVALID_SOCKET == sock)
{
cout<<"socket:"<<WSAGetLastError ( )<< endl;
goto errtag;
}

saAdd.sin_family = AF_INET;
saAdd.sin_addr.s_addr = htonl ( INADDR_ANY );
saAdd.sin_port = htons(0);

err = bind(sock, (sockaddr *) &saAdd, sizeof saAdd);

if ( SOCKET_ERROR == err )
{
cout<<"bind:"<<WSAGetLastError ( )<< endl;
goto errtag;
}

err = setsockopt ( sock, SOL_SOCKET, SO_BROADCAST,
(CHAR *) &bBroadcast, sizeof (BOOL) );

if ( SOCKET_ERROR == err )
{
cout<<"setsockopt:SO_BROADCAST:"<<WSAGetLastError ( )<< endl;
goto errtag;
}

saAdd.sin_family = AF_INET;
saAdd.sin_addr.s_addr = htonl ( INADDR_BROADCAST );

// why port = 2304 ? 我也不知道,只是抓包后,分析得出的
saAdd.sin_port = htons ( 2304 );

err = sendto ( sock, (const char *) pkg.Characters, sizeof pkg,
0, (SOCKADDR *) &saAdd, sizeof ( saAdd ));

if ( SOCKET_ERROR == err )
{
cout<<"sendto:"<<WSAGetLastError ( )<< endl;
goto errtag;
}

return bRet;

errtag:
if(sock != INVALID_SOCKET)
closesocket(sock);

return FALSE;
}

int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return 2;
}

if(WakeByLan())
{
cout<<"succefully send!"<<endl;
}
else
{
cout<<"send !"<<endl;
}

WSACleanup( );

return 0;
}
karlson0211 2004-01-17
  • 打赏
  • 举报
回复
up一下
激荡数十年 2004-01-17
  • 打赏
  • 举报
回复
Magic Packet Frame

The Magic Packet sequence consists of 16 duplications of the receiving node’s IEEE address, with no breaks or interruptions. This sequence can be located anywhere within the packet, but must be preceded by a synchronization stream. The synchronization stream, defined as 6 bytes of FFh, allows the scanning state machine to be much simpler. The device will also accept a BROADCAST frame, as long as the 16 duplications of the IEEE address match the address of the machine to be awakened. If the IEEE address for a particular node on the network was 11h 22h 33h 44h 55h 66h, then the LAN controller would be scanning for the data sequence (assuming an Ethernet Frame):

DESTINATION SOURCE MISC. FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66
11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 MISC. CRC.
gaoxianfeng 2004-01-17
  • 打赏
  • 举报
回复
up
乘思者 2004-01-17
  • 打赏
  • 举报
回复
什么意思?能不能说明一下?能不能举例说明一下C#编程怎么操作?
cai3995 2004-01-15
  • 打赏
  • 举报
回复
你先抓一下包,分析一下格式,然后自己做相类似的包发过去不就可以了
乘思者 2004-01-15
  • 打赏
  • 举报
回复
再说,他发送的帧只认MAC地址,和IP无关,怎么抓包呀!
乘思者 2004-01-15
  • 打赏
  • 举报
回复
不会……
乘思者 2003-11-12
  • 打赏
  • 举报
回复
就是不知道嘛!不过一般的Sohu路由器这个功能!
乘思者 2003-11-12
  • 打赏
  • 举报
回复
就是不知道嘛!不过一般的Sohu路尤其豆油这个功能!
速马 2003-11-10
  • 打赏
  • 举报
回复
// 发送一个唤醒帧就可以了
这个唤醒帧是什么样子的呀?
ruanyuping 2003-11-10
  • 打赏
  • 举报
回复
关注
redlion963 2003-11-10
  • 打赏
  • 举报
回复
看看

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧