본문으로 바로가기

Packet sniffer develop #pcap_freealldevs

category 카테고리 없음 2018. 4. 15. 14:31

전 포스팅에서 pcap_findalldevs를 통해서 네트워크 인터페이스 목록을 불러왔다. 그러나 이 함수를 사용할 경우 동적으로 메모리가 할당되기 때문에 사용이 끝난 후에는 메모리를 풀어주어야 한다.





pcap_freealldevs


1
void pcap_freealldevs(pcap_if_t *alldevsp);
cs


findalldevs 함수를 사용함으로써 동적으로 할당한 메모리를 풀어주는 함수이다.



Example



소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<pcap.h>
#include<arpa/inet.h>
 
int main(){
    pcap_if_t *alldevsp;
    pcap_if_t *d;
 
    char errbuf[PCAP_ERRBUF_SIZE];
    
    bpf_u_int32 netp;
    bpf_u_int32 maskp;
    int ret,i=1;
    struct in_addr addr;
    char *net;
 
    //int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
    printf("====== pcap_findalldevs ======\n");
    ret = pcap_findalldevs(&alldevsp,errbuf);
    if(ret == -1){
        printf("pcap_findalldev ERR : %s",errbuf);
        return -1;
    }
    
    for(d=alldevsp; d; d=d->next){
        printf("%d. %s", i++, d->name);
        if(d->description){
            printf("(%s)\n",d->description);
        }else{
            printf("(None)\n");
        }
    }
 
    printf("Select device number > ");
    scanf("%d",&i);
    i--;
 
    for(d=alldevsp;i>0;d=d->next, i--);
 
 
    //int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);
    printf("====== pcap_lookupnet ======\n");
    ret = pcap_lookupnet(d->name, &netp, &maskp, errbuf);
    if(ret==-1){
        printf("pcap_lookupnet ERR : %s",errbuf);
        pcap_freealldevs(alldevsp);
        return -1;
    }
    printf("dev   : %s\n",d->name);
    addr.s_addr = netp;
    net = inet_ntoa(addr);
    if(net ==NULL){
        printf("inet_ntoa ERR");
        pcap_freealldevs(alldevsp);
        return -1;
    }
    printf("netp  : %s\n",net);
    addr.s_addr = maskp;
    net = inet_ntoa(addr);
    if(net==NULL){
        printf("inet_ntoa ERR");
        pcap_freealldevs(alldevsp);
        return -1;
    }
    printf("maskp : %s\n",net);
    
    pcap_freealldevs(alldevsp);
    
    return 0;
}
 
cs





실행결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@g0pher-virtual-machine:/home/g0pher/sniff_tcpdump# ./sniffer 
====== pcap_findalldevs ======
1. ens33(None)
2. any(Pseudo-device that captures on all interfaces)
3. lo(None)
4. nflog(Linux netfilter log (NFLOG) interface)
5. nfqueue(Linux netfilter queue (NFQUEUE) interface)
6. usbmon1(USB bus number 1)
7. usbmon2(USB bus number 2)
Select device number > 1
====== pcap_lookupnet ======
dev   : ens33
netp  : 192.168.35.0
maskp : 255.255.255.0
cs