处于一些目的,有时需要对到达网口的所有网络数据进行捕获,系统也提供了这样的接口,稍微懂网络编程的都知道SOCK_DGRAM、SOCK_STREAM,差不多就UDP、TCP之类的吧。但是还有一个很少用的叫SOCK_RAW,原始套接字,使用它你可以捕获网卡上的所有网络数据,当然这需要超级用户权限。贴个列子吧,网上摘的,具体出处忘了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include /* the L2 protocols */

#include

#include

#include

#define BUFFER_MAX 2048

int main(int argc, char *argv[])

{

int sock, n_read;

char buffer[BUFFER_MAX];

struct sockaddr_ll sll;

struct ifreq ifstruct;

if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)

{

perror( "create socket error");

return -1;

}

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

sll.sll_family = PF_PACKET;

sll.sll_protocol = htons(ETH_P_ALL);

//get net card index ethx->index

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sock, SIOCGIFINDEX, &ifstruct);

sll.sll_ifindex = ifstruct.ifr_ifindex;

//bind net card

if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) == -1)

{

perror("bind error:\n");

return -1;

}

while(1)

{

n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);

if(n_read <= 0)

{

perror("recvfrom\n");

return -1;

}

//process packet

}

return 0;

}

其实原始套接字不仅可以捕获数据,也可以发送数据,而且是任意格式的数据,从MAC头到IP头之类的数据段都在自己的控制范围之内,什么ARP攻击、

DDoS攻击之类的都离不开原始套接字吧,不过这些封包是重点,这里篇幅有限不涉及封包了吧,只介绍如何将数据发出去

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include /* the L2 protocols */

#include

#include

#include

#define BUFFER_MAX 2048

int main(int argc, char *argv[])

{

int sockfd;

int n_write;

int n_res;

struct sockaddr_ll sll;

struct ifreq ifstruct;

char buffer[BUFFER_MAX];

char MAC_BUFFER[ETH_ALEN]= {0x00,0x18,0x82,0xab,0xd2,0xf9};

char TYPE_BUFFER[2] = {0x88,0x66};

if((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)

{

perror("create socket error:");

return -1;

}

n_res = 0;

n_write = 0;

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

sll.sll_family = PF_PACKET;

sll.sll_protocol = htons(ETH_P_ALL);

//get netcard interface index ethx->ifindex

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sockfd, SIOCGIFINDEX, &ifstruct);

sll.sll_ifindex = ifstruct.ifr_ifindex;

//get the local netcard mac

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sockfd, SIOCGIFHWADDR, &ifstruct);

memcpy(sll.sll_addr, ifstruct.ifr_ifru.ifru_hwaddr.sa_data, ETH_ALEN);

sll.sll_halen = ETH_ALEN;

//bind the netcard

if(bind(sockfd, (struct sockaddr *)&sll, sizeof(sll)) == -1)

{

perror("bind error:");

return -1;

}

//get the netcard work mode

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

strcpy(ifstruct.ifr_name, "eth0");

if(ioctl(sockfd, SIOCGIFFLAGS, &ifstruct) == -1)

{

perror("iotcl error:");

return -1;

}

//set the netcard work mode

ifstruct.ifr_flags |= IFF_PROMISC;

if(ioctl(sockfd, SIOCSIFFLAGS, &ifstruct) == -1)

{

perror("iotcl()\n");

printf("Fun:%s Line:%d\n", __func__, __LINE__);

return -1;

}

memcpy(buffer,MAC_BUFFER,ETH_ALEN);

memcpy(buffer+6,sll.sll_addr,ETH_ALEN);

memcpy(buffer+12,TYPE_BUFFER,2);

while(1)

{

n_res = sendto(sockfd, buffer, 1024,

0, (struct sockaddr *)&sll, sizeof(sll));

if(n_res < 0)

{

perror("sendto error:");

return -1;

}

n_write += n_res;

if(n_write >= 2048 * 2560)

{

break;

}

}

return 0;

}

linux 原始套接字 绑定网卡,Linux网络数据捕获之原始套接字相关推荐

  1. linux 原始套接字 绑定网卡,Linux原始套接字实现分析

    之所以要转这篇文章,是因为这篇文章是我看到的同类博客中写得最好的,但非常可惜,这篇博客中只有一篇文章,没有什么收藏价值,故将其原文转载,以供今后学习查阅. 本文从IPV4协议栈原始套接字的分类入手,详 ...

  2. linux拦截raw_socket原始套接字数据包的网络数据拦截方法

    前言 最近一直在寻找能拦截linux原始套接字数据包的方法,煞费苦心,终于功夫不负有心人,找到了一种方法可以实现,将这种方法分享给大家. 一.环境介绍 本次试验是基于CentOS7.6.1810,内核 ...

  3. linux启用NAT功能,双网卡共享网络,iptables简单实现

    最近在研究linux双网卡共享网络的情况 简单来说就是一台linux有两块网卡,比如eth0及eth1,eth0可以正常连接外网,eth1连接内部网络,那么可以通过iptables实现eth1内部网络 ...

  4. ar8161网卡 linux,Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉问题解决

    我的戴尔(Dell)I2330R-168一体电脑的网卡在升级某个Linux内核版本后,网卡就用一会儿就坏了 ifconfig eth0 eth0: flags=4163  mtu 8192 inet ...

  5. linux如何查看有几个网卡,linux 查看有几块网卡

    [ 引用 ifconfig  -a 引用 cat  /proc/net/dev [root@srmdr:/root]#ifconfig eth0      Link encap:Ethernet  H ...

  6. linux接收网络数据并存存储,linux网络数据包数据结构 Socket Buffer

    Linux网络核心数据结构是套接字缓存(socket buffer),简称skb.它代表一个要发送或处理的报文,并贯穿于整个协议栈.1.套接字缓存skb由两部分组成:(1)报文数据:它保存了实际在网络 ...

  7. Linux网络编程——端口复用(多个套接字绑定同一个端口)

    在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端 ...

  8. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  9. linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国

    原标题:Linux 下的进程间通信:套接字和信号 | Linux 中国 学习在 Linux 中进程是如何与其他进程进行同步的. -- Marty Kalin 本篇是 Linux 下(IPC)系列的第三 ...

最新文章

  1. Matlab | Matlab从入门到放弃(13)——基于Matlab的非线性函数的运算
  2. 公路多孔箱涵设计_【公路常识中篇】公路路基边坡滑坡防护设计和预防
  3. springmvc 源码分析
  4. 4款.Net报表控件优势对比分析
  5. oracle kill行锁,Oracle kill 锁表
  6. 【机器学习-西瓜书】二、模型评估:过拟合;自助法;交叉验证法
  7. WinEdt LaTex(四)—— 自定义新命令(newcommand、def)
  8. 邮递员算法问题之c++实现
  9. 企业研究:赢在起跑线,首个10年便建起壁垒的新国都
  10. 根据出生年月日计算出生了多少年,多少月,多少天
  11. 多元线性回归分析spss结果解读_SPSS经典线性回归分析之一——线性回归分析
  12. 外贸人需要准备的浏览器插件有哪些?
  13. ADB卸载OPPO浏览器
  14. Discuz如何开发关注功能
  15. pytorch中的Variable还有必要使用吗?
  16. Pandas中的resample重采样函数
  17. Java访问获取LDAP用户信息
  18. 基于深度学习的弹道目标智能分类
  19. 华翼宽带android客户端,实地测试 看华翼宽带是否带宽缩水_网络设备评测-中关村在线...
  20. 河北专接本计算机各学校分数线,2018年河北省专接本各学校录取分数线录取率...

热门文章

  1. 老男孩MysqlDBA专家班
  2. MIMIC IV数据库衍生表格配置
  3. 「找一找」考你眼力的时候到了!
  4. 【极简教程】用 Mkdocs 库发布你的网站
  5. uni App多图片上传,java后台接收
  6. 读书笔记-ListView与RecyclerView的使用
  7. Concat和Add操作
  8. gmail 过滤器_如何使用Gmail的高级搜索功能和创建过滤器
  9. Flutter实战项目-第八篇 监听键盘弹起
  10. 华为正式加入互联网路由安全规范 MANRS