나는 당신이 무엇을 요구하고 있는지 잘 모르겠다. 그러나 나는 그것을 감당할 수있을 것이라고 생각한다.
먼저, 디스패치 처리기이 서명과 일치하는 단 기능이다
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
가있다 -