· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Wake OnLAN

Wake on LAN (WOL)

Magic packetÀÇ »ý¼º

  • Wake on LAN (WOL)À» UDP»ó¿¡¼­ ±¸Çö ÇÏ´Â °æ¿ì UDP packetÀÇ Ã¹ 6 byte´Â FFH·Î ä¿öÁö°í ÀÌÈÄ ´ë»ó PCÀÇ Ethenet MAC address 6 byte°¡ 16ȸ ¹Ýº¹½ÃÄѼ­ UDP Magic packetÀ» ¸¸µé¼ö ÀÖ½À´Ï´Ù. ¸¸¾à MAC address°¡ "44:87:FC:8F:BB:B4" ¶ó°í ÇÑ´Ù¸é ´ÙÀ½°ú °°Àº UDP packetÀ» ¸¸µé¾î Broadcast³ª Unicast·Î ¼ÛÃâÇÏ¸é µË´Ï´Ù.
    00000000 FF FF FF FF FF FF 44 87 | FC 8F BB B4 44 87 FC 8F [......D.....D...]
    00000010 BB B4 44 87 FC 8F BB B4 | 44 87 FC 8F BB B4 44 87 [..D.....D.....D.]
    00000020 FC 8F BB B4 44 87 FC 8F | BB B4 44 87 FC 8F BB B4 [....D.....D.....]
    00000030 44 87 FC 8F BB B4 44 87 | FC 8F BB B4 44 87 FC 8F [D.....D.....D...]
    00000040 BB B4 44 87 FC 8F BB B4 | 44 87 FC 8F BB B4 44 87 [..D.....D.....D.]
    00000050 FC 8F BB B4 44 87 FC 8F | BB B4 44 87 FC 8F BB B4 [....D.....D.....]
    00000060 44 87 FC 8F BB B4                                 [D.....          ]
    


Wake on LAN (WOL) packetÀ» ¼ö½ÅÇÏ¿´´Âµ¥µµ ÄÑÁöÁö ¾Ê´Â °æ¿ì

¿Ïº®ÇÏ°Ô Wake on LAN (WOL)À» Áö¿øÇÏ´Â °æ¿ì´Â »ó°ü¾øÀ¸³ª H/W °¡°ÝÀ» ¶³¾î¶ß¸®±â À§Çؼ­ ÀϺΠÀü¿øÀÌ Àΰ¡ÇÏ¿© 1ȸ ºÎÆÃÈÄ Ä¿³Îµî¿¡ ÀÇÇؼ­ Wake on LAN (WOL)À» µ¿ÀÛ½Ãų¼ö ÀÖµµ·Ï ¸Å¹ø ¼³Á¤ÇØ¾ß µ¿ÀÛÇÏ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù.

Áï, Á¤Àüµî¿¡ ÀÇÇؼ­ ¿ÏÀüÈ÷ Àü¿øÀÌ ¼Ò½ÇµÈ °æ¿ì Àû¾îµµ ÇѹøÀº ºÎÆÃÈÄ Á¤»óÀûÀÎ shutdown ÀýÂ÷¸¦ ¹à¾Æ¾ß¸¸ Wake on LAN (WOL)ÀÌ µ¿ÀÛÇϵµ·Ï ¼³°èµÈ H/W °¡ ¸¹¾Æ¼­ À̸¦ Á¤È®È÷ È®ÀÎÈÄ »ç¿ëÇÏ½Ã´Â°Ô ÁÁ½À´Ï´Ù.

¿¹Á¦¼Ò½º

  • ¿¹Á¦ ¼Ò½º : ¾Æ·¡ÀÇ ¿¹Á¦´Â ¿©·¯°³ÀÇ NIC¸¦ °¡Áø ´ÙÁß IPȯ°æ¿¡¼­¿¡ ´ëÇÑ °í·Á´Â ºüÁ®ÀÖ½À´Ï´Ù. ½ÇÁ¦ ¹ü¿ëÀûÀÎ ±¸ÇöÀ» À§Çؼ­´Â ´ÙÁßIP¿¡ ´ëÇÑ bind ¹× °³º° IPº°·Î broadcast¸¦ ±¸ÇöÇϴ°ÍÀÌ ÁÁ´Ù´Â Á¡ À¯ÀÇ Çϸ鼭 º¸½Ã¸é ÁÁÀ»µí ÇÕ´Ï´Ù.
    /*
      Copyright (C) JAEHYUK CHO
      All rights reserved.
      Code by JaeHyuk Cho <mailto:minzkn@minzkn.com>
    */

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>

    int main(int s_argc, char **s_argv);

    int main(int s_argc, char **s_argv)
    {
        static const unsigned char s_target_mac[6] = { /* ÀÌ ºÎºÐÀ» ÀÚ½ÅÀÌ ±ú¿ì°íÀÚ ÇÏ´Â PCÀÇ Ethernet MAC address·Î ä¿öÁÖ¸é µÇ°Ú½À´Ï´Ù. */
            0x44u, 0x87u, 0xfcu, 0x8fu, 0xbbu, 0xb4u
        };

        int s_socket;
        struct sockaddr_in s_sockaddr_in;
        unsigned char s_magic_packet[ 6 + (6 * 16) ];
        int s_repeat;
        ssize_t s_send_bytes;
        int s_value;

        /* UDP socket open */
        s_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if(s_socket == (-1)) {
            perror("socket");
            return(EXIT_FAILURE);
        }

        /* bind */
        (void)memset((void *)(&s_sockaddr_in), 0, sizeof(s_sockaddr_in));
        s_sockaddr_in.sin_family = AF_INET;
        s_sockaddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
        s_sockaddr_in.sin_port = htons(0);
        if(bind(s_socket, (const struct sockaddr *)(&s_sockaddr_in), (socklen_t)sizeof(s_sockaddr_in)) == (-1)) {
            perror("bind");

            (void)close(s_socket);

            return(EXIT_FAILURE);
        }

        /* broadcast socket option enable (Broadcast¸¦ À§Çؼ­´Â SO_BROADCAST°¡ ¼³Á¤µÇ¾î¾ß ÇÕ´Ï´Ù.) */
        s_value = 1;
        (void)setsockopt(s_socket, SOL_SOCKET, SO_BROADCAST, (const void *)(&s_value), (socklen_t)sizeof(s_value));

        /* WOL packet build (repeat 6) */
        (void)memset((void *)(&s_magic_packet[0]), 0xff, (size_t)6u); /* Ã¹ 6byte´Â FFH·Î ä¿ó´Ï´Ù. */
        for(s_repeat = 0;s_repeat < 16;s_repeat++) { /* ±ú¿ì°íÀÚ ÇÏ´Â MAC address¸¦ 16ȸ ¹Ýº¹ÇÏ¿© ä¿ó´Ï´Ù. */
            (void)memcpy((void *)(&s_magic_packet[6 + (s_repeat * 6)]), (const void *)(&s_target_mac[0]), sizeof(s_target_mac));
        }

        /* broadcast socket address structure set */
        (void)memset((void *)(&s_sockaddr_in), 0, sizeof(s_sockaddr_in));
        s_sockaddr_in.sin_family = AF_INET;
        (void)inet_pton(s_sockaddr_in.sin_family, "255.255.255.255", (void *)(&s_sockaddr_in.sin_addr));
        s_sockaddr_in.sin_port = htons(2304); /* any port ... (»ç½Ç»ó port´Â ¾Æ¹«°Å³ª »ó°üÇÏÁö ¾Ê½À´Ï´Ù. ´Ù¸¸ ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥µé¿¡°Ô ¹æÇØ°¡ µÇÁö ¾Ê´Â Æ÷Æ®¸¦ ¼±ÅÃÇÏ´Â°Í »ÓÀÔ´Ï´Ù.) */

        /* send */
        s_send_bytes = sendto(
            s_socket,
            (const void *)(&s_magic_packet[0]),
            sizeof(s_magic_packet),
            0,
            (const struct sockaddr *)(&s_sockaddr_in),
            (socklen_t)sizeof(s_sockaddr_in)
        );
        if(s_send_bytes == ((ssize_t)(-1))) {
            perror("sendto");

            (void)close(s_socket);

            return(EXIT_FAILURE);
        }

        (void)fprintf(stdout,
            "WOL packet : %ld bytes (Target %02X:%02X:%02X:%02X:%02X:%02X)\n",
            (long)s_send_bytes,
            (unsigned int)s_target_mac[0], (unsigned int)s_target_mac[1], (unsigned int)s_target_mac[2],
            (unsigned int)s_target_mac[3], (unsigned int)s_target_mac[4], (unsigned int)s_target_mac[5]
        );

        /* socket close */
        (void)close(s_socket);

        return(EXIT_SUCCESS);
    }

    /* vim: set expandtab: */
    /* End of source */

ID
Password
Join
A truly wise man never plays leapfrog with a Unicorn.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-02-06 16:11:45
Processing time 0.0047 sec