리눅스에 SOCK_PACKET이라는 소켓이 있는데, 이것을 이용하면 어떤 MAC 프레임도 만들어서 전송할 수 있다. 사용방법은 코드를 보면 쉽게 알수 있다. 그리고, root만 가능하다. (ether_wake.c 를 참조하여 작성하였음.)

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <sys/socket.h>
 
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <sys/socket.h>

int send_packet(char *ifname, unsigned char *outpack, int pktsize)
{
        struct sockaddr whereto;
        int s;
        int one=1;
        int i;
 
        if ((s = socket(AF_INET, SOCK_PACKET, SOCK_PACKET)) < 0) {
                if (errno == EPERM)
                        fprintf(stderr, "send_packet must run as root\n");
                else
                        perror("send_packet: socket");
        }
 
        /* Don't revert if debugging allows a normal user to get the raw socket. */
        setuid(getuid());
 
        if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0)
                perror("setsockopt: SO_BROADCAST");
 
        whereto.sa_family = 0;
        strcpy(whereto.sa_data, ifname);
 
        if ((i = sendto(s, outpack, pktsize, 0, &whereto, sizeof(whereto))) < 0)
                perror("sendto");
 
        return 0;
}

+ Recent posts