zoukankan      html  css  js  c++  java
  • Linux下PF_PACKET的使用

    sock_raw(注意一定要在root下使用)原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对于监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket
     
    1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包,不能用IPPROTO_IP,因为如果是用了IPPROTO_IP,系统根本就不知道该用什么协议。
    2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧
    3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用啊
     
     

    1.介绍
    在linux中提供了PF_PACKET接口可以操作链路层的数据。
     
    2.使用方法
    定义一个pf_packet = socket(PF_SOCKET, SOCK_RAW, htons(ETH_P_RARP));
    就可以利用函数sendto和recefrom来读取和发送链路层的数据包了(当然,发送ARP包,上面第三个参数要变为 htons(ETH_P_ARP),或者IP的包为ETH_P_IP,可查看文件/usr/include/linux/if_ether.h文件看到所有支持的协议)。
     
    3.在使用SOCK_RAW, SOCK_DGRAM和SOCK_PACKET的区别
    在socket的第一个参数使用PF_PACKET的时候,上述三种socket的类型都可以使用。但是有区别。
    (1)使用SOCK_RAW发送的数据必须包含链路层的协议头,接受得到的数据包,包含链路层协议头。而使用SOCK_DGRAM则都不含链路层的协议头。
    (2)SOCK_PACKET也是可以使用的,但是已经废弃,以后不保证还能支持,不推荐使用。
    (3)在使用SOCK_RAW或SOCK_DGRAM和SOCK_PACKET时,在sendto和recvfrom中使用的地址类型不同,前两者使用sockaddr_ll类型的地址,而后者使用sockaddr类型的地址。
    (4)如socket的第一个参数使用PF_INET,第二个参数使用SOCK_RAW,则可以得到原始的IP包。

  • 相关阅读:
    Qt 打印机支持模块
    手动启动jenkins
    Ubuntu下安装Apache2, php5 mysql
    Ubuntu 使用apt-get时提示错误:无法获得锁 /var/lib/dpkg/lock
    scp 在不同机器上传文件
    python 正则表达式 贪婪模式的简介和匹配时的几种模式
    python指定pypi的源地址 镜像地址
    python三元运算符
    python导入上级目录中的模块
    linux下使用vim替换文件中的^M换行符
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2698163.html
Copyright © 2011-2022 走看看