• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: 其他
  • 标签: pcap  

资源简介

在linux简单实现网络的抓包程序,仅供参考喔

资源截图

代码片段和文件信息

QUOTE
//example.c
//使用方法:example〈网络接口名〉 > 〈输出文件名〉
//例如:example etho > temp.txe
//结束方法:ctrl+c
//程序开始,读入头文件
#include
#include
#include
#include
#include
#include
#include
#include //pcap程序库
#include //DNS检索使用 
#define MAXSTRINGSIZE 256 //字符串长度
#define MAXSIZE 1024 //主机高速缓存中的最大记录条数
#fefine DEFAULT_SNAPLEN 68 /数据包数据的长度
typedef struct
{
unsigned long int ipaddr; //IP地址
char hostname[MAXSTRINGSIZE]; //主机名
}dnstable; //高速缓存数据结构
typedef struct 
{
dnstable table[MAXSIZE];
int front;
int rear;
}sequeue; 
sequeue *sq; //定义缓存队列
sq->rear=sq->front=0; //初始化队列
//输出MAC地址函数
void print_hwadd(u_char * hwadd)
{
for(int i=0i<5;++i)
printf(“%2x:“hwadd);
printf(“%2x“hwadd);
}
//输出IP地址的函数
void print_ipadd(u_char *ipadd)
{
for(int i=0;i<3;++i)
printf(“%d.“ipadd);
printf(“%d“ipadd);
}
//查询端口函数
void getportname(int portnochar portna[]char* proto)
{
if(getservbyport(htons(portno)proto)!=NULL)
{
strcpy(portnagetservbyport(htons(portno)proto)->s_name);
}
else
sprintf(portna“%d“portno);
}
//将IP转化为DNS名
void iptohost(unsigned long int ipadchar* hostn)
{
struct hostent * shostname;
int mni;
m=sq->rear;
n=sq->front;
for(i=n%MAXSIZE;i=m%MAXSIZE;i=(++n)%MAXSIZE)
{
//检查IP是否第一次出现
if(sq->table.ipaddr==ipad)
{
strcpy(hostnsq->table.hostname);
break;
}
}
if(i=m%MAXSIZE)
{//不存在则从域名服务器查询并把结果放入高速缓存
if((sq->rear+1)%MAXSIZE=sq->front) //判队满
sq->front=(sq->front+1)%MAXSIZE; //出队列
sq->table.ipaddr=ipad;
shostname=gethostbyaddr((char*)&ipadsizeof(ipad)AF_INET);
if(shostname!=NULL)
strcpy(sq->table.hostnameshostname->h_name);
else
strcpy(sq->table.hostname““);
sq->rear=(sq->rear+1)%MAXSIZE;
}
}
void print_hostname(u_char* ipadd)
{
unsigned long int ipad;
char hostn[MAXSTRINTSIZE];
ipad=*((unsigned long int *)ipadd);
iptohost(ipadhostn)
if(strlen(hostn)>0)
printf(“%s“hostn);
else
print_ipadd(ipadd);
}
//处理数据包的函数
void packet_proce(u_char* packetsconst struct pcap_pkthdr * headerconst u_char 

*pp)
{
struct ether_header * eth; //以太网帧报头指针
struct ether_arp * arth; //ARP报头
struct ip * iph; //IP报头
struct tcphdr * tcph;
struct udphdr * udph;
u_short srcportdstport; //端口号
char protocol[MAXSTRINGSIZE]; //协议类型名
char srcp[MAXSTRINGSIZE]dstp[MAXSTRINGSIZE]; //端口名
unsigned int ptype; //协议类型变量
u_char * data; //数据包数据指针
u_char tcpudpdata[MAXSTRINGSIZE]; //数据包数据
int i;
eth=(struct ether_header *)pp;
ptype=ntohs(((struct ether_header *)pp)->ether_type);
if((ptype==ETHERTYPE_ARP)||(ptype==ETHERTYPE_RARP))
{
arph=(struct ether_arp *)(pp+sizeof(struct ether_header));
if(ptype==ETHERTYPE_ARP)
printf(“arp “);
else
printf(“rarp “); //输出协议类型
print_hwadd((u_char *)&(arph->arp_sha));
printf(“(“);
print_hostname((u_char *)&(arph->arp_spa));
printf(“)->“);
print_hwadd((u_char *)&(arph->arp_tha));
printf(“(“);
print_hostname((u_char *)&(arph->arp_tpa));
printf(“)tpacketlen:%d“header->len);
}
else if(ptype==ETHERTYPE_IP) //IP数据报
{
iph=(struct ip *)(pp+sizeof(struct ether_

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5155  2011-12-08 17:17  testpcap.c

----------- ---------  ---------- -----  ----

                 5155                    1


评论

共有 条评论