[출처] SOCK_PACKET 소켓을 이용해 아무 패킷이나 만들어 전송하기|작성자 쏘프트
SOCK_PACKET 소켓을 이용해 아무 패킷이나 만들어 전송하기
2011. 2. 22. 19:50
리눅스에 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;
}