注册 登录
编程论坛 Linux系统管理

找到的第一个用pcap的小程序

madfrogme 发布于 2012-08-09 20:09, 4467 次点击
一个打印网卡,network address , network mask 的小程序

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv) {
    char *dev; /* name of the device to use */
    char *net; /* dot notation of the network address*/
    char *mask; /* dot notation of the network mask*/
    int ret;
    char errbuf[PCAP_ERRBUF_SIZE];
    bpf_u_int32 netp; /* ip */
    bpf_u_int32 maskp; /* subnet mask */
    struct in_addr addr;

    /* ask pcap to find a valid device for use to sniff on */
    dev = pcap_lookupdev(errbuf);

    /*error checking */
    if(dev == NULL) {
        printf("%s\n",errbuf);
        exit(1);
    }

    /* print out device name */
    printf("DEV: %s\n",dev);

    /* ask pcap for the network address and mask of the device */
    ret = pcap_lookupnet(dev, &netp, &maskp, errbuf);
    if(ret == -1) {
        printf("%s\n",errbuf);
        exit(1);
    }

    addr.s_addr = netp;
    net = inet_ntoa(addr);

    if(net == NULL) {
        perror("inet_ntoa");
        exit(1);
    }
    printf("NET: %s\n",net);

    addr.s_addr = maskp;
    mask = inet_ntoa(addr);

    if(mask == NULL) {
        perror("inet_ntoa");
        exit(1);
    }
    printf("MASK: %s\n",mask);
   
    return 0;
}


编译的时候是
$ gcc -lpcap -o capture capture.c

执行的时候要用root,否则没反应
$ sudo ./capture

注一下in_addr 结构体提醒
#include <netinet/in.h>

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr {
    unsigned long s_addr;  // load with inet_aton()
};


[ 本帖最后由 madfrogme 于 2012-8-9 21:12 编辑 ]
0 回复
1