登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

有MAC地址怎么能才实现远程关机  

2009-09-14 13:44:57|  分类: 杂七杂八 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

远程唤醒
 远程唤醒技术(WOL,Wake-on-LAN) 是由网卡配合其他软硬件,通过给处于待机状态的网卡发送特定的数据祯,实现电脑从停机状态启动的一种技术。
 要想实现这种功能的电脑,对硬件的要求主要表现在电源,主板和网卡上。
 1.要想实现远程唤醒,首先计算机电源必须是符合ATX 2.01标准以上的ATX电源,+5V Standby电流至少应在600mA以上。主要是保证在电源主要供电停止工作后,通过Standby线路供给主板和网卡工作电源。P3处理器以后的电源都支持。
 2.其次主板必需要支持。在PCI2.1标准和2.1标准以前,支持远程唤醒的主板上通常都拥有一个专门的3芯插座,保证在停机状态下给网卡供电(工作时由PCI插槽供电)。由于现在的主板绝大部分支持PCI 2.2标准,在主机停机状态下仍然可以直接通过PCI插槽向网卡提供+3.3V Standby电源,这样就不需要外加的3芯电源线给网卡供电。符合PCI 2.2标准的主板在供电上都支持远程唤醒,但是有的不能响应网卡和PCI设备的开机信号。支持远程唤醒的主板在BIOS设置中还要将网卡和PCI设备启动功能打开。如:"Wake on LAN" "Wake on PCI Card" "power on lan" "power on pci card"设置项。
 3.最后网卡必须要支持WOL标准,这个标准最早由AMD公司提出。要想知道你的网卡是否支持WOL,在你确认电源、主板已经支持的情况下,你可以先将电脑关机,然后查看连接你网卡的设备上的网线连接状态指示灯。如果连接指示灯亮表示你的网卡支持WOL功能(即使主板BIOS中功能没有启用灯也亮),如果连接指示灯灭表示你的网卡不支持WOL功能。
 硬件调试、支持后,就可以通过连接网卡的设备,向还处于部分工作状态中的网卡发送特定的数据祯,数据祯的内容是16个网卡的MAC地址。网卡收到数据祯后比对自己的MAC地址,如果正确,网卡就会通过PCI插槽向主板发送一个开机信号,电脑启动。
 通过以上的说明可以知道远程唤醒技术不仅仅适用于局域网内。在硬件支持的基础上,只要能使正确的数据祯,从网卡的连接设备发给网卡就可以实现远程唤醒,通过internet网络照样可以实现。

//**********************************************************************特别注意唤醒数据包的格式******************

为了唤醒网络上的计算机,用户必须发出一种数据包,该数据包的格式与普通数据包不同,而且还必须使用相应的专用软件才能产生。当前比较普遍采用的是AMD公司制作的Magic Packet,这套软件可以生成网络唤醒所需要的特殊数据包。该数据包包含有连续6个字节的“FF”和连续重复16次的MAC地址。Magic Packet 虽然只是AMD公司开发推广的一项技术,并非业界公认的标准,但是仍受到很多网卡制造商的支持,因此许多具有网络唤醒功能的网卡都能与之兼容。

代码如下:

int sd; /****************************************Socket descriptor************************* */
 unsigned char dest_mac_address[10];
 unsigned char sync[10] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 unsigned char buf[126];
 int n; /******************************************** The number of octet sent to destination */
 struct sockaddr_in hostaddr;  /**************************************** holds socket address */
 char broadcastaddr[50];
 BOOL t=TRUE;//****************************************设置广播时候的一个参数
 char myip[20],macname[14];
 CString Temp,KeyWords="mac";//***************************读取配置文件关键字
 int Count=1;
 //MessageBox("启动开始!");
//********************************************************得到计算机IP地址和名字**************************************
 WORD   wVersionRequested;  
 WSADATA   wsaData;
 char   name[255]; 
 CString   ip;
 PHOSTENT   hostinfo;  
 wVersionRequested=MAKEWORD(2,0);  
   
 if(WSAStartup(wVersionRequested,&wsaData)== 0)  
 {  
  
  if(   gethostname   (name,sizeof(name))   ==   0)  
  {  
   if((hostinfo   =   gethostbyname(name))   !=   NULL)  
   {  
    ip   =   inet_ntoa   (*(struct   in_addr   *)*hostinfo->h_addr_list);  
   }  
  }  
  
  WSACleanup();  
 } 
//************************************************************检索配置文件*****************************************************************
 for(Count;;Count++)
 {  
  Temp=KeyWords+itostr(Count,10);
  GetPrivateProfileString("IpNameMac",Temp, NULL,macname, 14, ".\\Configure.ini");
  if(strlen(macname)>6)
  {
   
   if ( lstrlen(macname) != 12)
   {
    continue;
   }
   for (int x = 0; x < 12; x++)
   {
    macname[x]=toupper(macname[x]);//***********************把字母转换成大写的!*************************
    if ( strchr("0123456789ABCDEF",macname[x])==NULL)//*******************mac地址是否合法***************
    {
     continue;
    }
   }
   MessageBox(macname);//******************************************调试***************
   strcpy(myip,ip.GetBuffer(ip.GetLength()));
   get_broadcast_addr(broadcastaddr, myip,"255.255.255.0");//******************获得广播地址,X.X.X.255******************
   dest_mac_address[0] = atox(macname[0])*0x10 + atox(macname[1]);//dest_mac_address是char型的数组,10个字符
   dest_mac_address[1] = atox(macname[2])*0x10 + atox(macname[3]);//网卡地址是12位16进制数,共48位
   dest_mac_address[2] = atox(macname[4])*0x10 + atox(macname[5]);
   dest_mac_address[3] = atox(macname[6])*0x10 + atox(macname[7]);
   dest_mac_address[4] = atox(macname[8])*0x10 + atox(macname[9]);
   dest_mac_address[5] = atox(macname[10])*0x10 + atox(macname[11]);
   memcpy(buf, sync, 6);
   for (n = 0; n < 20; n++)
   {
    memcpy(&buf[6+n*6], dest_mac_address, 6);
   }

   MessageBox(broadcastaddr);//******************************************调试***************
   /* Set Destination Address */
       hostaddr.sin_family = AF_INET;
   hostaddr.sin_addr.s_addr = inet_addr(broadcastaddr);//广播地址
     
   /* Set Destination Port */
   hostaddr.sin_port = htons(7);
    
   /* Open an UDP socket */
   if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
   {
    //ShowSocketError(ps,"socket");
    return ;
   }
   
   /* Enable to broadcast */
   if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST, (char *)&t, sizeof(t)) == SOCKET_ERROR)
   {
    //    ShowSocketError(ps,"setsockopt");
    closesocket(sd);
    return ;
   }
   
   // // Log("Sending magic packet");
   /* Send *Magic data* to destination node */
   

   if ((n = sendto(sd,(const char FAR *) buf , 126, 0, (LPSOCKADDR)&hostaddr, sizeof(hostaddr))) == SOCKET_ERROR)
   {
    //ShowSocketError(ps,"sendto");
    closesocket(sd);
    return ;
   }
   
   /* Close the UDP socket */
   if (sd >= 0)
   {
    closesocket(sd);
   }
   Sleep(150); 
  }
  else
  {
   break;
  }
 }

  评论这张
 
阅读(2952)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018