您的位置:首页 > 运维架构 > Linux

linux操作链路层的数据

2015-07-27 16:37 525 查看
http://blog.csdn.net/zhoujunyi/article/details/1649073

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包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: