基于WINPCAP编写的第二程序

这个程序展示了如何使用WINPCAP库列出本地或远程机器的网络接口。它首先提示用户输入设备源,然后调用pcap_findalldevs_ex函数获取接口列表,并通过ifprint函数打印每个接口的详细信息,包括名称、描述、是否为环回接口以及地址信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<pcap.h>
#ifndef WIN32
	#include<sys/socket.h>
	#include<netinet/in.h>
#else
	#include<winsock.h>
#endif

void ifprint(pcap_if_t *d);

int main()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int i=0;
	char errbuf[PCAP_ERRBUF_SIZE+1];
	char source[PCAP_ERRBUF_SIZE+1];
	printf("Enter the device you want to list:\n"
            "rpcap://              ==> lists interfaces in the local machine\n"
            "rpcap://hostname:port ==> lists interfaces in a remote machine\n"
            "                          (rpcapd daemon must be up and running\n"
            "                           and it must accept 'null' authentication)\n"
            "file://foldername     ==> lists all pcap files in the give folder\n\n"
            "Enter your choice: ");
	fgets(source,PCAP_ERRBUF_SIZE,stdin);
	source[PCAP_ERRBUF_SIZE]='\0';

	if(pcap_findalldevs_ex(source,NULL,&alldevs,errbuf)==-1){
		fprintf(stderr,"Error in pcap_findalldevs: %s",errbuf);
		exit(1);
	}
	for(d=alldevs;d!=NULL;d=d->next){
		ifprint(d);
		printf("\n\n");
	}
	if(0!=i){
		printf("no interface found!Make sure winpcap is installed.\n");
	}
	pcap_freealldevs(alldevs);
	return 0;
}


void ifprint(pcap_if_t *d){
	
	pcap_addr_t *a;
	printf("name: %s\n",d->name);
	if(d->description)
	printf("description: %s\n",d->description);
	printf("loopback interface: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
	for(a=d->addresses;a!=NULL;a=a->next){
	  printf("address family: #%d\n",a->addr->sa_family);
		switch(a->addr->sa_family){
		case AF_INET:
			if(a->addr)
				printf("address: %s\n",inet_ntoa(((struct sockaddr_in *)a->addr)->sin_addr));
			if(a->netmask)
				printf("netmask: %s\n",inet_ntoa(((struct sockaddr_in *)a->netmask)->sin_addr));
			if(a->broadaddr)
				printf("broadaddr: %s\n",inet_ntoa(((struct sockaddr_in *)a->broadaddr)->sin_addr));
			if(a->dstaddr)
				printf("dstaddr: %s\n",inet_ntoa(((struct sockaddr_in *)a->dstaddr)->sin_addr));
			break;
		case AF_INET6:
			break;
		default:
			printf("address family: unknow\n");
			break;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值