Reputation: 7792
Here's my code, so far.
#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 *net; /* dot notation of the network address */
char *mask;/* dot notation of the network mask */
int ret; /* return code */
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netp; /* ip */
bpf_u_int32 maskp;/* subnet mask */
struct in_addr addr;
char *dev; /* name of the device to use */
printf("Asking pcap to find a valid device for use to sniff on.\n");
dev = pcap_lookupdev(errbuf);
if(dev == NULL) {
printf("pcap_lookupdev ERROR: %s\n",errbuf);
exit(1);
}
printf("Printing out device name.\n");
printf("DEV: %s\n",dev);
printf("Asking pcap for the network address and mask of the device.\n");
ret = pcap_lookupnet(dev,&netp,&maskp,errbuf);
if(ret == -1) {
printf("Unable to retrieve the network address and mask of the device. Error Description: %s\n",errbuf);
exit(1);
}
printf("Get the network address in a human readable form,\n");
addr.s_addr = netp;
net = inet_ntoa(addr);
if(net == NULL) {
printf("Unable to retrieve network address in human readable form.\n");
perror("inet_ntoa");
exit(1);
}
printf("NET: %s\n",net);
/* do the same as above for the device's mask */
addr.s_addr = maskp;
mask = inet_ntoa(addr);
if(mask == NULL) {
printf("Unable to retrieve device mask in human readable form. ");
perror("inet_ntoa");
exit(1);
}
printf("MASK: %s\n",mask);
return 0;
}
/*
Output:
Asking pcap to find a valid device for use to sniff on.
Printing out device name.
DEV: eth0
Asking pcap for the network address and mask of the device.
Unable to retrieve the network address and mask of the device. Error Description: eth0: no IPv4 address assigned
*/
Here's my question: What do I need to do to get pcap_lookupdev to look up wireless devices (i.e. wlan0)?
Upvotes: 1
Views: 3334
Reputation:
pcap_lookupdev()
will look up one device. That might not be the device you want; if you have both a wired and a wireless interface device, it might well find the wired device, and that's not because it's not looking at wireless devices, it's because that happened to be the first device it found.
There's no way to tell it to look only at wireless devices.
To get a list of all devices that libpcap can handle, use pcap_findalldevs()
.
Upvotes: 0
Reputation: 441
The documentation for pcap_findalldevs hints at the reason why pcap_lookupdev() is not finding any suitable network devices:
Note that there may be network devices that cannot be opened with pcap_open_live() by the process calling pcap_findalldevs(), because, for example, that process might not have sufficient privileges to open them for capturing; if so, those devices will not appear on the list
You probably don't have the necessary permission to capture traffic on any of the available network devices. Try running your program with sudo, assuming you have admin privileges on your machine.
See requirement of root privileges for libpcap functions for additional information.
Upvotes: 2