#include "pcap.h"
#define HAVE_REMOTE
#include "remote-ext.h"
#pragma comment(lib,"wpcap.lib")
int main()
{
pcap_if_t *alldevs; //pcap_if_t is interface type
pcap_if_t *d;
charerrbuf[PCAP_ERRBUF_SIZE]; // store error information
inti;
//struct pcap_rmtauth Ubuntu_cat;
charsource[PCAP_BUF_SIZE];
if(pcap_createsrcstr(source, PCAP_SRC_FILE,
NULL, NULL,
"本地连接",
errbuf)== -1) {
printf("Error in create source string: %s\n",errbuf);
exit(-1);
}
printf("%s\n", source);
if(pcap_findalldevs_ex(source, // can be PCAP_SRC_IF_STRING forlocal host
NULL, // auth to remote host. NULL if localhost
&alldevs,
errbuf) == -1) {
printf("Error in find all devices: %s\n",errbuf);
exit(1);
}
d =alldevs;
while(d!= NULL) {
printf("%s\n%s\nAddress: ", d->name, d->description);
for(i = 0; d->addresses != NULL&& i < 14; i++)
printf("%d ", d->addresses->addr->sa_data[i]);
printf("\n\n");
d =d->next;
}
pcap_freealldevs(alldevs);
return0;
}
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsignedchar*buf,int len);
#pragma comment(lib,"wpcap.lib")
/*生成数据包*/
void gen_packet(unsignedchar*buf,intlen)
{
inti=0;
//设置目标MAC地址为01:01:01:01:01:01
for(i=0;i<6;i++)
{
buf[i]=0x01;
}
//设置源MAC地址为02:02:02:02:02:02
for(i=6;i<12;i++)
{
buf[i]=0x02;
}
//设置协议标识为0xc0xd,无任何实际意义
buf[12]=0xc;
buf[13]=0xd;
//填充数据包的内容
for(i=14;i<len;i++)
{
buf[i]=i-14;
}
}
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
intinum;
inti=0;
pcap_t *adhandle;
charerrbuf[PCAP_ERRBUF_SIZE];
intret=-1;
/*获取本机网络设备列表 */
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &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");
/*释放设备列表 */
pcap_freealldevs(alldevs);
return-1;
}
/*跳转到选中的适配器 */
for(d=alldevs,i=0; i< inum-1 ;d=d->next, i++);
/*打开设备 */
if( (adhandle= pcap_open(d->name, // 设备名
65536, // 65535保证能捕获到数据链路层上每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, //远程机器验证
errbuf // 错误缓冲池
) ) ==NULL)
{
fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", d->name);
/*释放设备列表 */
pcap_freealldevs(alldevs);
return-1;
}
/*在选中的设备接口上发送数据*/
printf("\nsending on %s...\n", d->description);
/*发送数据包*/
//生成数据报
intpacketlen=100;
unsignedchar*buf= (unsigned char*)malloc(packetlen);
memset(buf,0x0,packetlen);
gen_packet(buf,packetlen);//获得生成的数据包,长度为packetlen
//开始数据包发送
if( (ret=pcap_sendpacket(adhandle,buf,packetlen))==-1)
{
printf("发送失败\n");
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return-1;
}
/*释放资源*/
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return0;
}
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsigned char *buf,int len);
#pragma comment(lib, "wpcap.lib")
int main(){
pcap_if_t * alldevs; //所有网络适配器
pcap_if_t *d; //选中的网络适配器
charerrbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区,大小为256
inti = 0; //适配器计数变量
/**
int pcap_findalldevs_ex ( char * source,
struct pcap_rmtauth * auth,
pcap_if_t ** alldevs,
char * errbuf );
PCAP_SRC_IF_STRING代表用户想从一个本地文件开始捕获内容;
*/
//获取本地适配器列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1){
//结果为-1代表出现获取适配器列表失败
fprintf(stderr,"Error inpcap_findalldevs_ex:\n",errbuf);
//exit(0)代表正常退出,exit(other)为非正常退出,这个值会传给操作系统
exit(1);
}
//打印设备列表信息
/**
d = alldevs 代表赋值第一个设备,d = d->next代表切换到下一个设备
结构体 pcap_if_t:
pcap_if * next 指向下一个pcap_if,pcap_if_t和pcap_if 结构是一样的
char * name 代表适配器的名字
char * description 对适配器的描述
pcap_addr * addresses 适配器存储的地址
u_int flags 适配器接口标识符,值为PCAP_IF_LOOPBACK
*/
for(d= alldevs;d !=NULL;d =d->next){
printf("number:%d name:%s",++i,d->name);
if(d->description){
//打印适配器的描述信息
printf("description:%s\n",d->description);
}else{
//适配器不存在描述信息
printf("description:%s","no description\n");
}
printf("flags:%s\n",d->flags);
}
//i为0代表上述循环未进入,即没有找到适配器,可能的原因为Winpcap没有安装导致未扫描到
if(i== 0){
printf("interface not found,pleasecheck winpcap installation");
}
//释放网络适配器列表
pcap_freealldevs(alldevs);
return0;
}
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsigned char *buf,int len);
#pragma comment(lib, "wpcap.lib")
void main(int argc, char **argv)
{
pcap_t*fp;
charerrbuf[PCAP_ERRBUF_SIZE];
u_charpacket[100];
inti;
/* 检查命令行参数的合法性*/
if(argc != 2)
{
printf("usage: %s interface (e.g.'rpcap://eth0')",argv[0]);
return;
}
/* 打开输出设备*/
if( (fp= pcap_open(argv[1], // 设备名
100, // 要捕获的部分 (只捕获前100个字节)
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", argv[1]);
return;
}
/* 假设在以太网上,设置MAC的目的地址为 1:1:1:1:1:1 */
packet[0]=1;
packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;
/* 设置MAC源地址为 2:2:2:2:2:2 */
packet[6]=2;
packet[7]=2;
packet[8]=2;
packet[9]=2;
packet[10]=2;
packet[11]=2;
/* 填充剩下的内容*/
for(i=12;i<100;i++)
{
packet[i]=i%256;
}
/* 发送数据包*/
if(pcap_sendpacket(fp, packet, 100 /*size */) !=0)
{
fprintf(stderr,"\nError sending the packet:\n",pcap_geterr(fp));
return;
}
return;
}