Linux ip_mreq 头文件,[转载]linux下利用PF_PACKET协议族捕包方法【转】

本文介绍了一段使用 C 语言编写的示例程序,演示如何在 Linux 系统中利用 PF_PACKET 协议族进行底层数据包捕获。PF_PACKET 协议族提供对原始分组的访问,允许在不经过 TCP/IP 协议栈处理的情况下捕获数据包。程序通过设置混杂模式实现 sniffer 功能,涉及的关键函数包括 ioctl、setsockopt 和 bind。

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

先放一段示例程序,这段程序我在RH9和AS4下编译通过,程序功能就是用从2.2内核加入的PF_PACKET协议族来进行底层数据包捕获并显示。

PF_PACKET协议族是与系统TCP/IP协议栈并行的同级别模块,即从PF_PACKET协议族得到的数据包是没有经过系统TCP/IP协议栈处理的。而且,通过设置混杂模式,可以很容易的实现sniffer。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define RED "E[31mE[1m"

#define GREEN "E[32mE[1m"

#define YELLOW "E[33mE[1m"

#define BLUE "E[34mE[1m"

#define NORMAL "E[m"

int Get_IfaceIndex(int fd, const char* interfaceName)

{

struct ifreq ifr;

if (interfaceName == NULL)

{

return -1;

}

memset(&ifr, 0, sizeof(ifr));

strcpy(ifr.ifr_name, interfaceName);

if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1)

{

printf("RED ioctl errorn");

return -1;

}

return ifr.ifr_ifindex;

}

int set_Iface_promisc(int fd, int dev_id)

{

struct packet_mreq mr;

memset(&mr,0,sizeof(mr));

mr.mr_ifindex = dev_id;

mr.mr_type = PACKET_MR_PROMISC;

if(setsockopt(fd, SOL_PACKET,

PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr))==-1)

{

fprintf(stderr,"GREEN set promisc failed! n");

return -1;

}

return 0;

}

void usage(char *exename)

{

fprintf(stderr,RED"%s

n"NORMAL,

exename);

}

int main(int argc, char **argv)

{

int listen_fd;

int ipak=0,maxk=0;

char buffer[8192];

int frmlen;

struct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值