现在有一些软件如: CMD 的Magic_pocket, lbmagic都可以实现, 但没有相关源码啊, 大家帮忙!

解决方案 »

  1.   

    要硬件支持的
    一般的协议是发送网卡的MAC地址和一堆FF到网卡
      

  2.   

    格式是重复6次的FF加上重复16次的MAC地址
      

  3.   

    // 定义MAC地址结构
    #ifndef tagMAC
    typedef struct tagMAC
    {
    unsigned char MacByte[6];
    }MAC, * LPMAC;
    #endif
    // 远程开机数据包的格式
    // [ethernet header][IP header][UDP header][Magic sequence][CRCS]
    //
    // Magic Sequence 的格式:
    //
    // FF FF FF FF FF FF (11 22 33 44 55 66) * 0x10
    BOOL WakeOnLAN(MAC mac)   // 存放被喚醒端 MAC
    {
         BYTE buf[102];        // 存放 magic package
         int i;    // 建立 magic package 內容
        // stage 1: 同步信号
        for (i=0; i<6; i++)
    {
            buf[i] = 0xFF;
        }   // stage 2: 被喚醒端 Mac 位址
       for (i=1; i<17; i++)
       memcpy(&buf[i*sizeof(MAC)], &mac, sizeof(MAC));   SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
       
       if (s == INVALID_SOCKET)
       return FALSE;
       SOCKADDR_IN tar;
       ZeroMemory(&tar, sizeof(tar));
       tar.sin_family = AF_INET;
       tar.sin_port =htons(80);
       tar.sin_addr.S_un.S_addr =  INADDR_BROADCAST;
       BOOL bBroadcast = TRUE;
       setsockopt(s, SOL_SOCKET, SO_BROADCAST,  (char *)&bBroadcast, sizeof(BOOL));
       if (sendto(s, (const char *)buf, 102, 0, (sockaddr *)&tar, sizeof(tar)) == SOCKET_ERROR)
       {
    int i = WSAGetLastError();
    //MessageBox(NULL, "Fuck", NULL, MB_OK);
    closesocket(s);
    return FALSE;
       }
       closesocket(s);
       return TRUE;
    }
      

  4.   

    网络唤醒是发送一种特殊的ethernet报文,到google搜索magic packet会有很多相关的。