2016-04-06 12 views
1

Ich bin in C codieren und libpcap Bibliothek verwenden. Ich möchte die Felder einer pcap_t Struktur, um zu sehen, haben aber immer den Fehler:Dereferenzierung Zeiger auf unvollständigen Typ für pcap_t Struktur

error: dereferencing pointer to incomplete type 

Minimal-Code ist der folgende:

#include<stdio.h> 
#include<pcap/pcap.h> 

int main() 
{ 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    pcap_t *handle; 
    handle=pcap_open_live("eth0", 65535, 1, 1, errbuf); 

    printf("Handle%d\n", handle->fd); 

    pcap_close(handle); 
} 

Compilation erfolgt durch:

gcc test.c -lpcap 

Nach zu http://www.opensource.apple.com/source/libpcap/libpcap-9/libpcap/pcap-int.h, hat die pcap_t Struktur dieses Feld. Die libpcap ist normalerweise enthalten, also verstehe ich überhaupt nicht.

Danke!

Fazit: Olaf scheint recht zu haben: Ich habe diesen Fehler, weil ich nicht auf die pcap_t Struktur zugreifen kann. Wie Antti Haapala sagte, ist pcap_t struct nicht in pcap/pcap.h definiert, sondern in einer anderen Datei.

Ich schaffte es trotzdem zu tun, was ich wollte, auch ohne Zugriff auf die Felder der Struktur.

Problem gelöst, danke für Ihre Hilfe!

+0

Lesen Sie über undurchsichtige Zeiger in C. Die 'struct' Definition ist wahrscheinlich versteckt, wie Sie nicht darauf zugreifen sollen. – Olaf

+0

Ja, es sieht so aus ... – snowfox

Antwort

1

die -int in pcap-int.h steht für internal. Sie fügen diese Überschrift jedoch nicht in Ihren Code ein.

Beachten Sie, dass pcap.h selbst diesen Header nicht enthält, noch enthält es eine vollständige Deklaration von struct pcap; anstatt nur mit der Forward-Deklaration in typedef:

typedef struct pcap pcap_t; 

Versuch mal:

#include <stdio.h> 
#include <pcap/pcap-int.h> 
#include <pcap/pcap.h> 

int main() 
{ 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    pcap_t *handle; 
    handle=pcap_open_live("eth0", 65535, 1, 1, errbuf); 

    printf("Handle%d\n", handle->fd); 

    pcap_close(handle); 
} 

Leider scheint es, dass diese internen Header nicht in Linux noch auf dem Mac installiert ist. Für einen extra-hässlichen Hack können Sie versuchen, den pcap-int.h von der Verbindung zu kopieren.

+0

Nur ein fataler Fehler: pcap/pcap-int.h: Keine solche Datei oder Verzeichnis Hat es für Sie funktioniert? – snowfox

+0

hmm Entschuldigung, mein Netzwerk war zurückgeblieben, ich dachte, ich hätte ein Update gepostet, aber es war fehlgeschlagen. –

0

Nun, Sie können tun, stattdessen entweder

printf("Handle%d\n", pcap_fileno(handle)); 

wenn Sie nichtselect()/poll()/epoll()/kqueues/etc verwenden gehen. auf dem Descriptor in Frage, oder

if (pcap_get_selectable_fd(handle) != -1) 
    printf("Handle%d\n", pcap_get_selectable_fd(handle)); 

wenn Sie sind gehen select()/poll()/epoll()/kqueues/etc verwenden. auf dem Deskriptor in Frage.

Der Unterschied besteht darin, dass, zumindest derzeit, es wird immer ein Dateideskriptor für ein pcap_t auf UN * Xes sein, aber es gibt keine Garantie, dass Sie select()/poll()/epoll()/kqueues/etc verwendet werden können. auf diesen Deskriptor.Auf neueren Versionen von BSD-aromatisierten Betriebssystemen (einschließlich OS X) können Sie auf Deskriptoren für normale Netzwerkschnittstellen tun, aber Sie können dies nicht auf einigen älteren Versionen von BSD-aromatisierten Betriebssystemen tun, und Sie müssen umgehen ein Problem bei anderen älteren Versionen von BSD-aromatisierten Betriebssystemen (Details siehe the man page for pcap_get_selectable_fd()). Dies ist auch bei einigen speziellen Geräten wie Endace DAG-Karten nicht möglich.

Also, in einigen Fällen pcap_get_selectable_fd() -1 zurück, was bedeutet, "es ist keine FD, auf dem Sie select() tun können, usw. für diesen pcap_t".

(Und ja, es ist beabsichtigt, dass pcap-int.h nicht installiert ist und dass pcap.h auch keine Aussage der Mitglieder einer struct pcap_t; der Inhalt dieser Struktur unterliegt von Release ändern zu lösen, und neuere libpcap Versionen werden entfernt a Los plattformabhängige und geräteabhängige Felder von dieser Struktur.)