一、在普通程序中设置网卡混杂模式。

在普通程序中普遍用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技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

将网卡设为混杂模式_网卡混杂模式实现方法相关推荐

  1. python的盈利模式_八大盈利模式是什么?一篇文教会你盈利模式分析!

    当今如果说到创业,永远绕不开一个话题:"模式". 非创业者往往最关注的是"产品"或"服务": 初级创业者往往最关注的的是"行业&q ...

  2. 工程模式和抽象工厂模式_功能工厂模式

    工程模式和抽象工厂模式 您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单. 我敢打赌,如果您对Lambdas相当满意,那么您只 ...

  3. 哈斯机床进去debug模式_责任链模式

    原文链接: 责任链模式 | 菜鸟教程​www.runoob.com 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请 ...

  4. shell开启飞行模式_手机飞行模式有什么用 手机飞行模式介绍【详解】

    手机飞行模式功能一直被大家吐槽为最没有用的手机功能,随着智能手机的快速发展,手机很多功能都已经逐渐消失被替代,唯独飞行模式依旧占据着手机设置里的主要地位. 那么问题来了,手机飞行模式到底有什么用? 1 ...

  5. 代理模式 委派模式 策略模式_设计模式 - 委派模式

    理解 首先委派模式不属于23种设计模式. 所谓委派,个人理解是:将为达到最终结果的事情交给其他人或中间人来干,我只要最终结果,其他的事情,由我委派的人来安排. 更直白的表达就是,比如,我们想要盖一栋楼 ...

  6. Hadoop 的三种运行模式_本地模式_伪分布式模式

    演示的版本是:2.7.2 官方文档 Hadoop运行模式 Hadoop运行模式包括:本地模式.伪分布式模式以及完全分布式模式. Hadoop官方网站:http://hadoop.apache.org/ ...

  7. java mediator模式_中介者模式(Mediator)

    中介者模式 一. 中介者模式 1.1 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互. 1.2 角色 抽象中介者类(A ...

  8. win无线网卡怎么进入监听模式_网卡灯正常,但却不能连入网络该如何解决?

    故障现象:主机网卡灯正常,但无法连入局域网正常上网.大概会有什么原因导致?需要如何处理?如下图所示: 原因分析: 按照过去以往处理此类型问题的经验,可以考虑重新启动主机测试,如有条件下可以重新启动网络 ...

  9. myeclipse深色模式_完善深色模式的调色板

    myeclipse深色模式 Apps largely have a limited color palette which may already map well to dark mode. How ...

最新文章

  1. 转载: EMD(Emprical mode decomposition)经验模态分解
  2. Ubuntu 用vsftpd 配置FTP服务器
  3. ldap的shema
  4. java struts2 上传图片_Java框架Struts2实现图片上传功能
  5. shell获取本机ip
  6. miui国际版/波兰版 开通公交卡 / 模拟门禁卡
  7. 关闭计算机的方式有哪些,关机快捷键有哪些?电脑Windows快捷关机最全方法图文详解...
  8. mysql utf8占几个字节_utf-8的中文是一个字符占几个字节
  9. 笔记本电脑启动无法打开计算机,笔记本电脑开机没反应(详细教程教您怎么解决)...
  10. 平面变压器大概价格_平面变压器
  11. 一法通则百法通 佳能照片打印机连供改造
  12. ​入行快30年了,你问我计算机有啥用,我还真的要想想
  13. 肥大向心力衰竭压力超负荷法致充血性心力衰竭动物模型
  14. BZOJ 5395--[Ynoi2016]谁的梦(STL容斥)
  15. CDN加速服务,CDN公共库汇总
  16. python快速入门【六】----真题测试
  17. ZUI易入门Android之SQL 语句大全
  18. 为Linux编译atheros ar1111(设备ID:168c:0037,AW-NB100H – AR5B225 Atheros half size)网卡驱动...
  19. pytorch_lesson16.2 架构对学习/鲁棒性的影响(VGG16复现+感受野+平移不变性)+架构对参数量的影响(1*1卷积核+分组卷积与深度分离卷积+NiN网络复现)
  20. 小伙子用C++打造3D台球游戏:这水平可以去打斯诺克世锦赛吗?

热门文章

  1. Udp数据丢包测试--iperf3
  2. PHP zip压缩与解压
  3. simulink飞轮储能永磁风机PMSG和同步机一次调频。
  4. IBM研究:2014年Android应用漏洞激增
  5. windows10 下安装vc6
  6. 1. JDBC详解~
  7. 视频号更像是2.0版的公众号
  8. mapbox 地图交互
  9. 有些事情,一辈子坚持那么一次,就已经足够了 .
  10. 【网络安全】用badusb控制局域网PC的webcam