2012-02-11 2 views
1
int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 

내가 pcap_dispatch는 패킷 콜백 루틴에 전달 된 첫 번째 인수를 수신시 콜백 루틴을 호출 이해에 인수를 전달하는 것은 pcap_dipatch 함수의 마지막 인수입니다. 그렇다면 콜백 루틴의 나머지 두 가지 인수는 어떻습니까? pcap_dispatch은 어디에서 전달되어야하는 다른 인수를 얻습니까?pcap_dispatch은/콜백 함수

답변

1

나는 당신이 무엇을 요구하고 있는지 잘 모르겠다. 그러나 나는 그것을 감당할 수있을 것이라고 생각한다.

먼저, 디스패치 처리기이 서명과 일치하는 단 기능이다

void packethandler(u_char *args, const struct pcap_pkthdr* pkthdr, 
        const u_char* packet) 

도이다 오른쪽에서, 패킷 libpcap의 네트워크 인터페이스는 PCAP 형식의 패킷 헤더에서 추출한 왼쪽 인자 패킷 처리기에 대한 인수

첫 번째 주장이 문제가 될 수 있다고 생각합니다. 여러 개의 인수를 전달해야하는 경우이를 수행 할 수 있습니다. va_args을 사용하는 대신 여러 개의 인수를 전달하려는 경우 간단히 struct를 정의 할 수 있습니다. 당신이 다음 전달할 수 있습니다 typedef struct { ... } myparams; 가정 : 매개 변수로하여 핸들러 내부

(u_char*) myparamstruct 

을 수행하여 데이터 포인터를하지 통과하고 있기 때문에

myparams* params = (myparams*) args; 

이 작동합니다. 포인터의 유형은 단순히 포인터의 실제 값이 아니라 기본 포인터로 사용 된 역 참조 된 위치 유형 (데이터 해석 방법)을 설명합니다. 모든 포인터가 똑같이 넓기 때문에 (어쨌든이 목적을 위해).

그래서이 인수를 얻는 방법을 다룰 것입니다. 나머지 두 인수에 관해서는 앞에서 말한 것처럼 libpcap이 지정된 네트워크 인터페이스에서 캡처 한 것입니다. 기본적으로 패킷이 성공적으로 추출 될 때마다 핸들러는 함수 포인터를 통해 호출되며 패킷 세부 정보는 해당 인수로 인코딩되고 사용자가 제공 한 인수 포인터를 통해 전달됩니다. pkthdr가있다 -

2

다른 두 인수는 (당신이 pcap_t를 엽니 다 pcap_open_live() 또는 pcap_create()/pcap_activate()를 사용하는 경우) 또는 (당신이 pcap_t를 엽니 다 pcap_open_offline()를 사용하는 경우) 캡쳐 파일에서 읽은 바로 캡처 된 패킷에서 온 패킷에 대한 타임 스탬프, 네트워크 상에 나타나는 패킷의 길이 및 스냅 샷 길이만큼 짧게 절단 된 후의 패킷 길이를 포함하는 구조. packet은 원시 패킷 데이터입니다.