扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
本函数从已连接套接口上接收数据,并捕获数据发送源的地址。对于SOCK_STREAM类型的套接口,最多可以接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为 SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
4)一些“字节顺序”转换函数
因为网络和主机采用的存储字节时内存顺序安排方式的差异,就存在“字节顺序”的问题。在网络环境下存储时,高位字节存放在内存的起始位置,而低字节则存放在较高的位置。主机形式的存放顺序恰好相反,低位字节存放在内存的起始位置。这就需要以下相应的字节顺序转换函数:
inet_ntoa():将32位的网络二进制数值转换为可读十进制形式的带点分割符的IP地址。
inet_addr():将带有分割符的IP地址转换为32位的unsigned long的格式。
ntohs():将网络字节顺序转换为32位的主机字节顺序。
ntohl():将网络字节顺序转换成16位的主机字节顺序。
htonl():将32位u_long的值由主机字节顺序转换为网络字节顺序。
htons():将16位u_long的值由主机字节顺序转换为网络字节顺序。
本文设计的数据捕获程序需要使用SOCK_PACKET设备,SOCK_PACKET只在基于Linux的操作系统中有效定义。为此,美国洛仑兹伯克利国家实验室编写了专用于数据包截获的API函数库“Libpcap”。该函数的设计目标是统一不同系统上所提供的用于数据包截获的不同类型接口,并使得类似的高层应用程序的编写和移植变得简单有效,不再需要对每一个应用都使用不同的依赖于具体系统的数据包截获模块。
四、基于Linux的数据包捕获模块设计实现
1、 数据包捕获模块设计流程图
在数据包捕获程序中,通过设置网卡工作于混杂状态,对网络链路进行监听并收集数据包,从而获得数据包头信息。其流程图如图2所示:
启动SOCKET函数
设置网卡为混杂模式
从缓冲区接收数据
数据包格式检查并显示
数据处理模块
图2 数据包捕获模块流程图
2、数据包捕获模块实现
该数据包捕获程序用C语言来编写,程序中用到很多Linux网络编程中的函数。
(1)设置网络接口为混杂模式
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者