将网卡设为混杂模式_网卡混杂模式实现方法
一、在普通程序中设置网卡混杂模式。
在普通程序中普遍用ioctl函数来设置,该函数很值得大家好好的了解,因为它的使用非常的广泛。下面
给出设置网卡混杂模式的实现代码:
#include
#include
#include
#include
int set_all_promisc()
{ struct ifreq ifaces[16];
struct ifconf param;
int sock, i;
param.ifc_len = sizeof(ifaces);
param.ifc_req = ifaces;
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock <= 0)
return 0;
if (ioctl(sock, SIOCGIFCONF, ¶m))
return 0;
for (i = 0; i < param.ifc_len / sizeof(struct ifreq); i++) {
if (ioctl(sock, SIOCGIFFLAGS, ifaces + i))
return 0;
ifaces[i].ifr_flags |= IFF_PROMISC; /*如果恢复网卡模式,把|= 改成 &=~ */
if (ioctl(sock, SIOCSIFFLAGS, ifaces + i))
return 0;
}
return 1;
}
二、在核心空间中设置混杂模式
1.在kernel-2.2.x 中
static struct device *sniffer_dev = NULL;
static unsigned short old_flags, old_gflags;
int init_module ( void ) /* 模块初始化 */
{
......
sniffer_dev = dev_get("eth0");
if ( sniffer_dev != NULL )
{
/* thanks for difeijing of whnet's Security */
old_flags = sniffer_dev->flags;
old_gflags = sniffer_dev->gflags;
/*
* 参看net/core/dev.c里的dev_change_flags()
* ->gflags的作用是避免多次重复设置混杂模式,没有其他特别含义
*/
/* 设置混杂模式 */
sniffer_dev->flags |= IFF_PROMISC;
sniffer_dev->gflags |= IFF_PROMISC;
start_bh_atomic();
/* 注意,这个回调函数还是会报告 eth0: Setting promiscuous mode. */
sniffer_dev->set_multicast_list( sniffer_dev );
end_bh_atomic();
}
......
return 0;
}
void cleanup_module(void)
{
......
if (sniffer_dev != NULL)
{
/* 恢复原有模式 */
sniffer_dev>flags = old_flags;
sniffer_dev>gflags = old_gflags;
start_bh_atomic();
sniffer_dev>set_multicast_list( sniffer_dev );
end_bh_atomic();
}
......
}
2.在kernel-2.4.x 中
在2.4中有了许多变化,首先struct device结构改为struct net_device, 再者dev_get
功能改为测试网络设备是否存在,真正的设置网络混杂模式的函数改为
void dev_set_promiscuity(struct net_device *dev, int inc);
其中根据inc的值来设置混杂模式还是恢复原来设置模式,通过计数来恢复原来模式,这样的好处就是:不会和其他的程序冲突,不在像上述两种实现方式中恢复原来模式就全恢复了,不管还有没有其他的程序是否也设置了混杂模式。现在就通过计数来恢复原来的模式,只要当计数相加为零才设置成普通模式。
linux源代码的注释如下:
/**
* dev_set_promiscuity - update promiscuity count on a device
* @dev: device
* @inc: modifier
*
* Add or remove promsicuity from a device. While the count in the device
* remains above zero the interface remains promiscuous. Once it hits zero
* the device reverts back to normal filtering operation. A negative inc
* value is used to drop promiscuity on the device.
*/
设置网卡混杂模式的实现代码如下:
struct net_device *sniffer_dev = NULL;
int dev_flags = 0;
int init_module ( void ) /* 模块初始化 */
{
......
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 1;
dev_set_promiscuity(sniffer_dev, 1);
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
......
return 0;
}
void cleanup_module(void)
{
......
if (dev_flags)
{
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 0;
dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
}
......
}
小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!
免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!
将网卡设为混杂模式_网卡混杂模式实现方法相关推荐
- python的盈利模式_八大盈利模式是什么?一篇文教会你盈利模式分析!
当今如果说到创业,永远绕不开一个话题:"模式". 非创业者往往最关注的是"产品"或"服务": 初级创业者往往最关注的的是"行业&q ...
- 工程模式和抽象工厂模式_功能工厂模式
工程模式和抽象工厂模式 您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单. 我敢打赌,如果您对Lambdas相当满意,那么您只 ...
- 哈斯机床进去debug模式_责任链模式
原文链接: 责任链模式 | 菜鸟教程www.runoob.com 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请 ...
- shell开启飞行模式_手机飞行模式有什么用 手机飞行模式介绍【详解】
手机飞行模式功能一直被大家吐槽为最没有用的手机功能,随着智能手机的快速发展,手机很多功能都已经逐渐消失被替代,唯独飞行模式依旧占据着手机设置里的主要地位. 那么问题来了,手机飞行模式到底有什么用? 1 ...
- 代理模式 委派模式 策略模式_设计模式 - 委派模式
理解 首先委派模式不属于23种设计模式. 所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排. 更直白的表达就是,比如,我们想要盖一栋楼 ...
- Hadoop 的三种运行模式_本地模式_伪分布式模式
演示的版本是:2.7.2 官方文档 Hadoop运行模式 Hadoop运行模式包括:本地模式.伪分布式模式以及完全分布式模式. Hadoop官方网站:http://hadoop.apache.org/ ...
- java mediator模式_中介者模式(Mediator)
中介者模式 一. 中介者模式 1.1 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互. 1.2 角色 抽象中介者类(A ...
- win无线网卡怎么进入监听模式_网卡灯正常,但却不能连入网络该如何解决?
故障现象:主机网卡灯正常,但无法连入局域网正常上网.大概会有什么原因导致?需要如何处理?如下图所示: 原因分析: 按照过去以往处理此类型问题的经验,可以考虑重新启动主机测试,如有条件下可以重新启动网络 ...
- myeclipse深色模式_完善深色模式的调色板
myeclipse深色模式 Apps largely have a limited color palette which may already map well to dark mode. How ...
最新文章
- 转载: EMD(Emprical mode decomposition)经验模态分解
- Ubuntu 用vsftpd 配置FTP服务器
- ldap的shema
- java struts2 上传图片_Java框架Struts2实现图片上传功能
- shell获取本机ip
- miui国际版/波兰版 开通公交卡 / 模拟门禁卡
- 关闭计算机的方式有哪些,关机快捷键有哪些?电脑Windows快捷关机最全方法图文详解...
- mysql utf8占几个字节_utf-8的中文是一个字符占几个字节
- 笔记本电脑启动无法打开计算机,笔记本电脑开机没反应(详细教程教您怎么解决)...
- 平面变压器大概价格_平面变压器
- 一法通则百法通 佳能照片打印机连供改造
- ​入行快30年了,你问我计算机有啥用,我还真的要想想
- 肥大向心力衰竭压力超负荷法致充血性心力衰竭动物模型
- BZOJ 5395--[Ynoi2016]谁的梦(STL容斥)
- CDN加速服务,CDN公共库汇总
- python快速入门【六】----真题测试
- ZUI易入门Android之SQL 语句大全
- 为Linux编译atheros ar1111(设备ID:168c:0037,AW-NB100H – AR5B225 Atheros half size)网卡驱动...
- pytorch_lesson16.2 架构对学习/鲁棒性的影响(VGG16复现+感受野+平移不变性)+架构对参数量的影响(1*1卷积核+分组卷积与深度分离卷积+NiN网络复现)
- 小伙子用C++打造3D台球游戏:这水平可以去打斯诺克世锦赛吗?