[1. 함수 원형]
[2. 함수 설명]
- pcap_dispatch()
cnt 만큼 명시한 패킷만큼 만 callback 함수를 통해 처리 한 후 종료 한다.
여기서 cnt 는 최소가 아닌 최대 개수를 의미하는데,
pcap_open_live() 로 pcap descriptor 오픈 시 버퍼 만큼의 패킷을 받은 경우 1개의 패킷만 처리될 수 있기 때문이다.
-1 을 명시한 경우는 해당 버퍼로 받을 수 있는 모든 패킷을 의미한다.
user 로 명시 된 포인터는 콜백함수로 그대로 전달 되므로, 이를 함수 간 통신 매개체로 사용 할 수 있어 보인다.
return 값에 대한 의미는 보통 읽은 개수의 패킷이나 아래와 같은 예외 상황이 있다.
0: 패킷이 필터링 되거나, read timeout 등으로 인해 패킷을 읽지 못한 경우
=> linux 기준 pcap 은 raw socket 으로 구현되므로 커널 netfilter 에 의해 먼저 필터링 된 경우 raw socket 으로 해당 패킷이 전달되지 않는다.
=> 일부 플랫폼에서는 read timeout 을 지원하지 않을 수 있다.
-1: 에러 발생으로 pcap_error() 나 pcap_geterr() 로 에러 메시지를 확인 할 수 있다.
-2: pcap_breakloop() 로 인해 패킷 처리 전 종료되었음을 의미한다. - pcap_loop()
기본적으로 pcap_dispatch() 와 유사하나 가장 큰 차이점은 read timeout 시에도 반환하지 않고 명시한 개수의 패킷이 처리될 때 까지 기다린다는 것이다.
cnt 가 -1 인 경우는 loop forever 에 의미이다.
에러 발생 시 -1을 반환하고
cnt 만큼 패킷을 처리한 경우 0을 반환 한다. (정상 종료 의미)
pcap_breakloop() 에 의해 종료 된 경우 -2 를 반환한다. - pcap_next()
pcap_dispatch() 로 cnt 1 을 사용한 호출 하여 다음 패킷을 읽는다.
해당 패킷에 대한 포인터 형태를 반환하며,
에러가 발생한 경우, 패킷이 필터링 된 경우 또는 readtime out 시 NULL 을 반환한다.반환 된 패킷에 대한 pcap_ptkhdr 구조체는 제공되지 않으며,
에러 구분을 위한 방법은 존재하지 않는다. - pcap_breakloop()
내부적으로 UNIX 의 경우 signal handler 를 사용하고 Windows 의 경우 console control handler 를 사용해서 안전하게 패킷 캡쳐 함수를 종료 시킬 수 있다. - callback 함수
user 는 캡쳐 세션의 상태를 포함 하는 user-defined parameter 이다.
pcap_dispatch() 와 pcap_loop() 호출 시 전달되는 paramter 이다.
pkt_header 는 protocol header 아닌 패킷을 캡쳐한 드라이버와 관련된 헤더이다.
pkt_data 가 실제 패킷이 저장 된 포인터이다.
[3. 예제]
'C++ > Pcap' 카테고리의 다른 글
pcap_open_live 함수 (0) | 2022.03.06 |
---|---|
pcap_lookupnet 함수 (0) | 2022.03.06 |
pcap_findalldevs 함수 (0) | 2022.03.06 |
pcap 개발 환경 설정 (0) | 2022.03.06 |