raw 소켓프르그래밍 질문입니다.
글쓴이: revol2236 / 작성시간: 화, 2009/08/11 - 5:54오후
안녕하세요
kldp눈으로만 보다가(실력이 모잘라서 글을 올릴 용기가,,,,) 요즘 공부하는 소켓에 대한 질문 드립니다..
요즘 raw 소켓을 공부하고 있는데요
구글링으로 ip tcp헤더로 페킷을 보내는 소스를 구해서 한번 실행시켜 봤습니다..
그런데 tcpdump로 패킷을 잡아서 보는데 제가 보낸 패킷은 하나도 나오지 않도군요,,;;
그 소스입니다
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> // Socket 관련 헤더 파일 포함 #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> // tcp/ip 관련 헤더 파일 포함 #include <linux/ip.h> #include <linux/tcp.h> int main() { unsigned char packet[40]; int raw_socket; int on = 1 ; struct iphdr *iphdr; struct tcphdr *tcphdr; struct sockaddr_in address; raw_socket = socket( AF_INET, SOCK_RAW, IPPROTO_RAW ); setsockopt( raw_socket, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof(on) ); tcphdr = (struct tcphdr *)(packet + 20); memset( (char *)tcphdr, 0, 20 ); tcphdr->source = htons( 777 ); tcphdr->dest = htons( 12345 ); tcphdr->seq = htonl( 8 ); tcphdr->ack_seq = htonl(9 ); tcphdr->doff = 5; tcphdr->syn = 1; tcphdr->window = htons( 512 ); tcphdr->check = 1; iphdr = (struct iphdr *)packet; memset( (char *)iphdr, 0, 20 ); iphdr->version = 4; iphdr->ihl =4; iphdr->protocol = IPPROTO_TCP; iphdr->tot_len = 40; iphdr->id = htons( 777 ); iphdr->ttl = 60; iphdr->check = 1; iphdr->saddr = inet_addr( "111.111.111.111" ); iphdr->daddr = inet_addr( "192.168.10.110" ); address.sin_family = AF_INET; address.sin_port = htons( 12345 ); address.sin_addr.s_addr = inet_addr( "192.168.10.110" ); sendto( raw_socket, &packet, sizeof(packet), 0x0, (struct sockaddr *)&address, sizeof(address)); }
목적지는 제공유기내에 ip로 했습니다
체크섬 계산은 일부로 뺐습니다.....
무엇이 문제인지 모르겠습니다,,,,
raw socket에 관한책은 제가봤을때에는 거의 없었기 때문에 이렇게 질문 올립니다,,
벌써 이것땜에 이틀밤에 밤을 세웠네요,,;;
ps. icmp 헤더와 tcp/ip헤더를 같이 쓰려하는데 어떻하는지 아십니까??ㅋㅋ
Forums:
위 코드가 전부 인가요?
성공적으로 실행되어도 공유기로 보내셨다고 하면 확인할 방법이 없는 듯 한데요?
raw socket에 관한 예제는 구글링 해보셔도 어느정도(?) 나옵니다.
댓글 달기