pcap Library
pcap library download : http://www.tcpdump.org
download in linux : apt-get install libpcap
참조 사이트 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/AdvancedComm/pcap_intro
device setup
char pcap_lookupdev(char *errbuf); |
패킷을 캡쳐할 적당한 네트워크 디바이스(NIC : Network Interface Card)를 찾아 그 디바이스를 지칭하는 String을 반환한다. |
▪ char *errbuf : 에러 발생 시 에러 메시지 저장하는 버퍼. |
int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf); |
네트워크 디바이스의 네트워크 주소와 netmask 정보를 가져오기 위해 사용된다. |
▪ char *device : 네트워크 디바이스의 별명(alias). |
pcap_t *pcap_open_live(char *device, int snaplen, int mode, int to_ms, char *ebuf); |
네트워크의 패킷들을 보기 위해 필요한 packet capture descriptor를 얻기 위해 사용된다. |
▪ char *device : 사용할 네트워크 디바이스를 지시하는 String. "nay", NULL로 설정할 경우 모든 디바이스에서 패킷을 캡쳐한다. |
packet filtering
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask); |
스트링 형태의 필터링 룰을 해석해 bpf_program 구조체에 저장한다. |
▪ pcap_t *p : 패킷 캡쳐 descriptor. |
int pcap_setfilter(pcap_t *p, struct bpf_program *fp); |
네트워크 장치 디스크립터에 필터 프로그램을 지정함. pcap_compile()을 통해 결정된 bpf_program 구조체를 적용할 때 사용된다. |
▪ pcap_t *p : 패킷 캡쳐 descriptor. |
packet capture
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) |
pcap_next함수는 pcap_open_live함수를 통해 리턴된 장치ID인 p를 넘겨 캡쳐한 패킷의 기본정보를 h에 담아주고 해당 패킷의 데이터를 리턴하게 된다. |
pcap_t *p : 패킷 캡쳐 descriptor. |
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user); |
실제 패킷을 잡아서 실행할 함수를 지정해 주는 함수입니다. cnt의 수만큼 패킷을 잡아서 잡을 때 마다 해당 패킷을 처리하기 위해 allback 함수를 수행하게 된다. |
▪ pcap_t *p : 패킷 캡쳐 descriptor. |
void pcap_close(pcap_t *p) |
pcap_t와 관계되는 파일을 닫고 사용한 자원들을 닫는다. |
▪ pcap_t *p : 패킷 캡쳐 descriptor. |
1. 네트워크 인터페이스 명칭 지정한다.
2. 네트워크 인터페이스 디스크립터 얻는다.
3. filter rule 을 컴파일 시킨다.
4. 컴파일된 filter rule을 네트워크 인터페이스에 적용한다.
5. 패킷을 모으고, 패킷에 따른 프로세싱을 한다.