sock_raw
来源:互联网 发布:淘宝网店实战宝典下载 编辑:程序博客网 时间:2024/06/08 06:38
sock_raw编辑
理解一下SOCK_RAW的原理, 比如网卡收到了一个 14+20+8+100+4(以太网头+ip头+udp头+数据+crc) 的udp的以太网数据帧.
(注意一定要在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))过时了,不要用啊
协议类型
socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
能:该套接字可以接收协议类型为(tcp udp icmp等)发往本机的ip数据包,从上面看的就是20+8+100.
不能:不能收到非发往本地ip的数据包(ip软过滤会丢弃这些不是发往本机ip的数据包).
不能:不能收到从本机发送出去的数据包.
发送的话需要自己组织tcp udp icmp等头部.可以setsockopt来自己包装ip头部
这种套接字用来写个ping程序比较适合
2. socket(PF_PACKET, SOCK_RAW, htons(x));
这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧.从上面看就是14+20+8+100.最后一个以太网crc从来都不算进来的,因为内核已经判断过了,对程序来说没有任何意义了.
能: 接收发往本地mac的数据帧
能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL)
能: 接收非发往本地mac的数据帧(网卡需要设置为promisc混杂模式)
协议类型一共有四个
ETH_P_IP 0x800 只接收发往本机mac的ip类型的数据帧
ETH_P_ARP 0x806 只接受发往本机mac的arp类型的数据帧
ETH_P_RARP 0x8035 只接受发往本机mac的rarp类型的数据帧
ETH_P_ALL 0x3 接收发往本机mac的所有类型ip arp rarp的数据帧, 接收从本机发出的所有类型的数据帧.(混杂模式打开的情况下,会接收到非发往本地mac的数据帧)
发送的时候需要自己组织整个以太网数据帧.所有相关的地址使用struct sockaddr_ll 而不是struct sockaddr_in(因为协议簇是PF_PACKET不是AF_INET了),比如发送给某个机器,对方的地址需要使用struct sockaddr_ll.
示例代码
......
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 创建Socket
struct sockaddr_ll sll; // 注意结构体是sockaddr_ll
memset( &sll, 0, sizeof(sll) );
sll.sll_family = AF_PACKET;
struct ifreq ifstruct;
strcpy(ifstruct.ifr_name, "eth0");
ioctl(sockfd, SIOCGIFINDEX, &ifstruct); //控制I/O设备
sll.sll_ifindex = ifstruct.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
if(bind(fd, (struct sockaddr *) &sll, sizeof(sll)) == -1 ) { //在这里当然仍然需要绑定的
perror("bind()");
......
0 0
- sock_raw
- sock_raw
- SOCK_RAW Demystified
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET,SOCK_RAW.
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- 原始套接字SOCK_RAW
- jni 调用sock_raw -- 端口扫描
- 原始套接字SOCK_RAW
- SOCK_RAW, icmp, ping实现
- 拦截网络数据包(SOCK_RAW)
- SOCK_RAW 与 SOCK_STREAM 、SOCK_DGRAM 区别
- 原始套接字(SOCK_RAW)概述
- 数组中只出现一次的字符
- cocos2d-x 中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)
- ctrl-c,ctrl-z,ctrl-d区别
- Robot framework+python自定义测试库的方法
- js跳转到锚点
- sock_raw
- Android入门:用HttpClient模拟HTTP的GET和POST请求
- POJ 2965-The Pilots Brothers' refrigerator(位运算+BFS+回溯路径)
- 详述C疑难杂症_序列点
- ios in-house 发布整个过程(startssl认证)
- 垂直同步、绘制效率、显示器刷新频率与帧率
- 【ROLLUP】Oracle分组函数之ROLLUP魅力
- SCP断点续传
- Android view切换动画大全