[재질문] incomming 패킷만 잡는 방법 없을까요?????
글쓴이: ecstasy5001 / 작성시간: 월, 2008/04/21 - 5:12오후
... ... sock_fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP); sll.sll_family = AF_PACKET; sll.sll_ifindex = 0; sll.sll_protocol = htons(ETH_P_IP); bind(sock_fd, (struct sockaddr *)&sll, sizeof(sll)); while(1) { packet_len = recvfrom( sock_fd, packet, sizeof(packet), MSG_TRUNC, (struct sockaddr *)&from, &fromlen); if ( ( from.sll_pkttype == PACKET_LOOPBACK) || ( from.sll_pkttype == PACKET_OUTGOING)) continue; // 들어온 패킷을 처리 }
답변이 없어서... 다시 재질문 드립니다.
한 프로그램에서 2개의 스레드를 생성하게 됩니다.
A스레드는 위에 보시는 코드와 같이 패킷을 캡쳐해서 어떠한 처리를 하고
B스레드는 외부로 패킷을 보내는 일을 합니다.
헌데 이상하게도 A스레드에서 B스레드의 패킷이 잡혔습니다..( 이게 정상 맞나요? )
A스레드에서 B스레드가 쏘는 패킷(OUTGOING PACKET)을 잡지 않기 위해서 외부로 나가는 패킷을 위에
코드를 보시는데로 다음과 같이 처리했습니다.
if ( ( from.sll_pkttype == PACKET_LOOPBACK) || ( from.sll_pkttype == PACKET_OUTGOING))
헌데 계속 A스레드에서 B스레드가 보내는 패킷을 잡고 있습니다...
질문을 요약하면 다음 두가지 입니다.
1. 위와 같은 상황에서 A스레드에서 B스레드가 쏘는 패킷을 잡히는게 정상적인가요??
2. 위의 문제를 해결하기 위해서 (A스레드에서 INCOMMING 패킷만 캡쳐하고 싶을 경우)
어떤 식으로 해결해야 할까요...?
답변 부탁드리겠습니다.
Forums:
저는 유사한 기능을
저는 유사한 기능을 netfilter 의 nf_queue 를 통해서 해결했습니다.
netfilter 를 이용하면 패킷 드랍등도 가능하니 한 번 참고해 보세요.
pcap 추천합니다.
질문의 직접적인 답변은 아니지만
패킷을 잡아 어떤 일을 하고 싶을때는
위의 분이 제시한 netfilter 부분을 사용하는 것과
pcap Library를 사용하는 것이 일반적입니다.
저는 범용적인 pcap을 강력하게 추천합니다.
사용법도 socket 수준으로 간단하며 아주 강력합니다.
unix의 tcpdump도 위의 라이브러리를 사용합니다.
자세한 것은 여기로 www.tcpdump.org 입니다.
댓글 달기