⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 对WinPacp库的测试使用
💻 CPP
字号:
#include "pcap.h"
#pragma comment(lib,"packet.lib")
#pragma comment(lib,"wpcap.lib")
//	//获得网卡 的列表
//main()
//{
//	//pcap_if_t *alldevs;
//	//pcap_if_t *d;
//	//int i=0;
//	//char errbuf[PCAP_ERRBUF_SIZE];
//
//	///* 这个API用来获得网卡 的列表 */
//	//if (pcap_findalldevs(&alldevs, errbuf) == -1)
//	//{
//	//	fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
//	//	exit(1);
//	//}
//
//	///* 显示列表的响应字段的内容 */
//	//for(d=alldevs;d;d=d->next)
//	//{
//	//	printf("%d. %s", ++i, d->name);
//	//	if (d->description)
//	//		printf(" (%s)\n", d->description);
//	//	else printf(" (No description available)\n");
//	//}
//
//	//if(i==0)
//	//{
//	//	printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
//	//	return;
//	//}
//
//	///* We don‘t need any more the device list. Free it */
//	//pcap_freealldevs(alldevs);
//	//获得网卡 的列表
//}
//

////网络驱动器的高级信息
//#include "pcap.h"
//#ifndef WIN32
//#include <sys/socket.h>
//#include <netinet/in.h>
//#else
//#include <winsock.h>
//#endif
//void ifprint(pcap_if_t *d);
//char *iptos(u_long in);
//int main()
//{
//	pcap_if_t *alldevs;
//	pcap_if_t *d;
//	char errbuf[PCAP_ERRBUF_SIZE+1];
//	/* 获得网卡的列表 */
//	if (pcap_findalldevs(&alldevs, errbuf) == -1)
//	{
//		fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
//		exit(1);
//	}
//	/* 循环调用ifprint() 来显示pcap_if结构的信息*/
//	for(d=alldevs;d;d=d->next)
//	{
//		ifprint(d);
//	}
//	return 1;
//}
///* Print all the available information on the given interface */
//void ifprint(pcap_if_t *d)
//{
//	pcap_addr_t *a;
//	/* Name */
//	printf("%s\n",d->name);
//	/* Description */
//	if (d->description)
//		printf("\tDescription: %s\n",d->description);
//	/* Loopback Address*/
//	printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
//	/* IP addresses */
//	for(a=d->addresses;a;a=a->next) {
//		printf("\tAddress Family: #%d\n",a->addr->sa_family);
//		/*关于 sockaddr_in 结构请参考其他的网络编程书*/
//		switch(a->addr->sa_family)
//		{
//		case AF_INET:
//			printf("\tAddress Family Name: AF_INET\n");//打印网络地址类型
//			if (a->addr)//打印IP地址
//				printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
//			if (a->netmask)//打印掩码
//				printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
//			if (a->broadaddr)//打印广播地址
//				printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
//			if (a->dstaddr)//目的地址
//				printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
//			break;
//		default:
//			printf("\tAddress Family Name: Unknown\n");
//			break;
//		}
//	}
//	printf("\n");
//}
///* 将一个unsigned long 型的IP转换为字符串类型的IP */
//#define IPTOSBUFFERS 12
//char *iptos(u_long in)
//{
//	static char output[IPTOSBUFFERS][3*4+3+1];
//	static short which;
//	u_char *p;
//	p = (u_char *)&in;
//	which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
//	sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
//	return output[which];
//} 

/* prototype of the packet handler */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
main()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int inum;
	int i=0;
	pcap_t *adhandle;
	char errbuf[PCAP_ERRBUF_SIZE];
	/* 获得网卡的列表 */
	if (pcap_findalldevs(&alldevs, errbuf) == -1)
	{
		fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
		exit(1);
	}
	/* 打印网卡信息 */
	for(d=alldevs; d; d=d->next)
	{
		printf("%d. %s", ++i, d->name);
		if (d->description)
			printf(" (%s)\n", d->description);
		else
			printf(" (No description available)\n");
	}
	if(i==0)
	{
		printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
		return -1;
	}
	printf("Enter the interface number (1-%d):",i);
	scanf("%d", &inum); //输入要选择打开的网卡号
	if(inum < 1 || inum > i) //判断号的合法性
	{
		printf("\nInterface number out of range.\n");
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}
	/* 找到要选择的网卡结构 */
	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
	/* 打开选择的网卡 */
	if ( (adhandle= pcap_open_live(d->name, // 设备名称
		65536, // portion of the packet to capture. 
		// 65536 grants that the whole packet will be captured on all the MACs.
		1, // 混杂模式
		1000, // 读超时为1秒
		errbuf // error buffer
		) ) == NULL)
	{
		fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}
	printf("\nlistening on %s...\n", d->description);
	/* At this point, we don‘t need any more the device list. Free it */
	pcap_freealldevs(alldevs);
	/* 开始捕获包 */
	pcap_loop(adhandle, -1, packet_handler, NULL);
	return 0;
}

/* 对每一个到来的数据包调用该函数 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
	struct tm *ltime;
	char timestr[16];
	/* 将时间戳转变为易读的标准格式*/
	ltime=localtime(&header->ts.tv_sec);
	strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
	printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -