2024年10_libpcap以及libnet,校园物联网嵌入式开发面试题

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

int pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)
功能:
循环捕获网络数据包,直到遇到错误或者满足退出条件;
每次捕获一个数据包就会调用callback指示的回调函数,
所以,可以在回调函数中进行数据包的处理操作
返回值:
成功返回0,失败返回负数
参数:
p:Libpcap句柄
cnt:指定捕获数据包的个数,如果是-1,就会永无休止的捕获
callback:回调函数
user:向回调函数中传递的参数


![](https://img-blog.csdnimg.cn/41b1a9a414574eed9c9c5d2f5392a188.png)


回调函数如何定义: 


![](https://img-blog.csdnimg.cn/016efd73bc734f8392549cb700b05a27.png)![](https://img-blog.csdnimg.cn/4ebe4fefc5a14b0a828c935144fba75d.png)


参数1:argument存放pcap\_loop传递过来的user用户数据


参数2:packet\_heaher 存放接收到的报文的时间以及长度


参数3:packet\_content接收到的网络帧数据


案例:



#include<stdio.h>
#include <pcap.h>
//pcap_loop每收到一个报文 就会调用一次回调函数
void callback(u_char *arg, const struct pcap_pkthdr *packet_header,
const u_char *packet_content)
{
unsigned char *msg = packet_content;
printf(“报文长度:%u\n”, packet_header->caplen);
//解析msg的mac地址
char src_mac[18]=“”;
char dst_mac[18]=“”;
sprintf(dst_mac,“%02x:%02x:%02x:%02x:%02x:%02x”,
msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]);
sprintf(src_mac,“%02x:%02x:%02x:%02x:%02x:%02x”,
msg[0+6],msg[1+6],msg[2+6],msg[3+6],msg[4+6],msg[5+6]);
printf(“%s—>%s\n”, src_mac, dst_mac);
}
int main()
{
//1、创建一个pcap句柄
pcap_t *pcap_handle = NULL;
pcap_handle = pcap_open_live(“eth0”,1500,0,0,NULL);

//2、接受数据 带阻塞
pcap_loop(pcap_handle, 5, callback, NULL);

//关闭句柄
pcap_close(pcap_handle);
return 0;

}


 运行结果:


![](https://img-blog.csdnimg.cn/fa754c6a450c487e89bc1ff4acc4c1e0.png)


8、设置过滤规则 下面两个函数配合使用


pcap\_compile: 将用户识别的规则 转换成 pcap识别的规则


pcap\_setfilter:将pcap识别的规则 设置到pcap结束数据的句柄中



int pcap_compile(pcap_t *p,struct bpf_program *program,
char *buf,int optimize,bpf_u_int32 mask)
功能:
编译BPF过滤规则
返回值:
成功返回0,失败返回-1
参数:
p:Libpcap句柄
program:bpf过滤规则(pcap识别的规则)
buf:过滤规则字符串(用户识别的规则 重心)
optimize:优化
mask:掩码



int pcap_setfilter(pcap p,struct bpf_programfp)
功能:
设置BPF过滤规则
返回值:
成功返回0,失败返回-1
参数:
p:Libpcap句柄
fp:BPF过滤规则


![](https://img-blog.csdnimg.cn/3f3df8ba06d2421b9b596ee178c9cffc.png)


 过滤规则:


![](https://img-blog.csdnimg.cn/78a77463d0f6469f9a5352e721166e9b.png)


![](https://img-blog.csdnimg.cn/425f03895037436e9def27145a7e0418.png)![](https://img-blog.csdnimg.cn/6344799d0faa4086ae016be170af4880.png) ![](https://img-blog.csdnimg.cn/ef18ef74f6ef448e8c0385b6080b5686.png)


 案例:



#include<stdio.h>
#include <pcap.h>
//pcap_loop每收到一个报文 就会调用一次回调函数
void callback(u_char *arg, const struct pcap_pkthdr *packet_header,
const u_char *packet_content)
{
unsigned char *msg = packet_content;
printf(“报文长度:%u\n”, packet_header->caplen);
//解析msg的mac地址
char src_mac[18]=“”;
char dst_mac[18]=“”;
sprintf(dst_mac,“%02x:%02x:%02x:%02x:%02x:%02x”,
msg[0],msg[1],msg[2],msg[3],msg[4],msg[5]);
sprintf(src_mac,“%02x:%02x:%02x:%02x:%02x:%02x”,
msg[0+6],msg[1+6],msg[2+6],msg[3+6],msg[4+6],msg[5+6]);
printf(“%s—>%s\n”, src_mac, dst_mac);
}
int main()
{
//1、创建一个pcap句柄
pcap_t *pcap_handle = NULL;
pcap_handle = pcap_open_live(“eth0”,1500,0,0,NULL);

//设置过滤规则
struct bpf_program program;
pcap_compile(pcap_handle,&program, "src port 9000", 0, 0xffffff00);
pcap_setfilter(pcap_handle, &program);

//2、接受数据 带阻塞
pcap_loop(pcap_handle, 5, callback, NULL);

//关闭句柄
pcap_close(pcap_handle);
return 0;

}


 ![](https://img-blog.csdnimg.cn/ad30dc3a9403416cafc066e4944169f2.png)


知识点3【libnet发送原始套接字数据】


专业的构造和发送网络数据包的开发工具包


是个高层次的API函数库,允许开发者自己构造和发送网络数据包


头文件:include


编译的是加:-lnet


Libnet的安装


![](https://img-blog.csdnimg.cn/0df405beb35e44c3b2291106cb6f7298.png)


Libnet开发流程


利用libnet函数库开发应用程序的基本步骤:


1、数据包内存初始化


2、构造数据包


3、发送数据


4、释放资源


![](https://img-blog.csdnimg.cn/ee5478713a584d279c6908873d27d3a6.png)


1、内存管理相关函数



libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
功能:
数据包内存初始化及环境建立
参数:
injection_type: 构造的类型
(LIBNET_LINK,LIBNET_RAW4,LIBNET_LINK_ADV(推荐),LIBNET_RAW4_ADV)
device:网络接口,如"eth0",或IP地址,亦可为NULL(自动查询搜索)
err_buf: 存放出错的信息
返回值:
成功返回一个libnet句柄;失败返回NULL



injection_type:构造的类型(LIBNET_LINK,LIBNET_RAW4,LIBNET_LINK_ADV,LIBNET_RAW4_ADV)


![](https://img-blog.csdnimg.cn/12ba27902f5847a7a82cdc5432e52c10.png)


 ![](https://img-blog.csdnimg.cn/ed28144e09504924b80c0016e3c9b2a6.png)


 2、释放资源



void libnet_destroy(libnet_t *l);
功能:
释放资源
参数:
  l: libnet句柄
返回值:


3、构建udp报文 



libnet_ptag_t libnet_build_udp(
u_int16_t sp,u_int16_t dp,u_int16_t len,u_int16_t sum,
u_int8_t *payload,u_int32_t payload_s,
libnet_t *l,libnet_ptag_t ptag)
功能:
构造udp数据包
返回值:
成功返回协议标记;失败返回-1
参数:
sp: 源端口号
dp:目的端口号
len:udp包总长度
sum:校验和,设为0,libnet自动填充
payload:负载,可设置为NULL
payload_s:负载长度,或为0
l: libnet句柄
ptag:协议标记(其值为0创建一个新的协议数据,不为0,修改由ptag表示的协议数据)


 4、构造一个IPv4数据包



libnet_ptag_t libnet_build_ipv4(
u_int16_t ip_len,u_int8_t tos,
u_int16_t id,u_int16_t flag,
u_int8_t ttl,u_int8_t prot,
u_int16 sum,u_int32_t src,
u_int32_t dst,u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,libnet_ptag_t ptag)
功能:
构造一个IPv4数据包
参数:
ip_len:ip包总长
tos:服务类型
id:ip标识
flag:片偏移
ttl:生存时间
prot:上层协议
sum:校验和,设为0,libnet自动填充
src: 源ip地址
dst:目的ip地址
payload:负载,可设置为NULL
payload_s:负载长度,或为0
l: libnet句柄
ptag:协议标记
 
返回值:
成功返回协议标记;失败返回-1


5、构造一个以太网数据包



libnet_ptag_t libnet_build_ethernet(
u_int8_t *dst,u_int8_t *src,
u_int16_t type,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,libnet_ptag_t ptag)
功能:
构造一个以太网数据包
 
参数:
dst:目的mac
src:源mac
type:上层协议类型
payload:负载,即附带的数据
payload_s:负载长度
l:libnet句柄
ptag:协议标记
 
返回值:
成功返回协议标记;失败返回-1


6、发送数据到网络



int libnet_write(libnet_t * l)
功能:
发送数据到网络
参数:
  l:libnet句柄
返回值:
失败返回-1,成功返回其他


综合案例:发送udp数据



#include<stdio.h>
#include <libnet.h>
#include<string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
//1、初始化内存
libnet_t *lib_handle = libnet_init(LIBNET_LINK_ADV,“eth0”,NULL);

char data[128]="";
printf("请输入要发送的udp数据:");
fgets(data,sizeof(data),stdin);
data[strlen(data)-1]=0;
int data_len = strlen(data)+strlen(data)%2;//长度为偶数

//构建数据包:从应用层--->链路层
//1、构建udp数据
libnet_ptag_t ptag_udp = libnet_build_udp(8000,9000,8+data_len,\
0,data,data_len, lib_handle, 0);

//2、构建IP报文
libnet_ptag_t ptag_ip = libnet_build_ipv4(20+8+data_len,0,0,0,128,\
17,0,inet_addr("192.168.0.111"),inet_addr("192.168.0.110"),\
NULL,0, lib_handle, 0);

//3、构建mac数据报文
unsigned char src_mac[6]={0x00,0x0c,0x29,0x79,0xf9,0x7f};
unsigned char dst_mac[6]={0x70,0x5A,0x0F,0x63,0xF5,0x9D};
libnet_ptag_t ptag_mac = libnet_build_ethernet(dst_mac, src_mac, 0x0800,\
NULL,0, lib_handle, 0);

//4、发送帧数据
libnet_write(lib_handle);

//循环的发送5次
int i=0;
for(i=0;i<5;i++)
{
	printf("请输入要发送的udp数据:");
	fgets(data,sizeof(data),stdin);
	data[strlen(data)-1]=0;
	data_len = strlen(data)+strlen(data)%2;//长度为偶数
	
	//重新构建udp报文
	ptag_udp = libnet_build_udp(8000,9000,8+data_len,\
0,data,data_len, lib_handle, ptag_udp);
	
	//重新构建IP报文
	ptag_ip = libnet_build_ipv4(20+8+data_len,0,0,0,128,\
17,0,inet_addr("192.168.0.111"),inet_addr("192.168.0.110"),\
NULL,0, lib_handle, ptag_ip);
	//发送帧数据
	libnet_write(lib_handle);
}

//释放资源
libnet_destroy(lib_handle);
return 0;

}


知识点4【BS开发概述】浏览器和服务器开发


![](https://img-blog.csdnimg.cn/b6971a24c1eb49d79178749ec88d418d.png)


HTML:超文本标记语言 静态的 显示网页


CSS:层叠样式表 渲染网页


XML:指可扩展标记语言 传输网页


Javascript:脚本语言 和 网页交互 (局部刷新网页)


AJAX:基于Javascript语言的技术 (将网页 和 服务器 交互)


CGI:通用网关接口(服务器 借助 CGI 控制 外设(数据库、传感器设备、文件))


![](https://img-blog.csdnimg.cn/58a7d3055606455a9017ce3e2bf60ae5.png)


2、B/S架构就是浏览器和服务器架构


Browser/Server(浏览器/服务器结构),是随着Internet技术的兴起,是对C/S结构的一种变化或者改进的结构。


用户界面完全通过www浏览器实现,一部分事物逻辑在前端实现,但是主要事务逻辑在服务器端实现。


B/S架构 与 C/S架构对比




|  |  |  |
| --- | --- | --- |
| 角度 | C/S | B/S |
| 硬件环境 | 专用网络 | 广域网 |
| 安全要求 | 面向相对固定的用户群 信息安全的控制能力很强 | 面向是不可知的用户群 对安全的控制能力相对弱 |
| 程序架构 | 更加注重流程 系统运行速度可较少考虑 | 对安全以及访问速度要多重的考虑 B/S结构的程序架构是发展的趋势 |
| 软件重用 | 差 | 好 |
| 系统维护 | 升级难 | 开销小、方便升级 |
| 处理问题 | 集中 | 分散 |
| 用户接口 | 与操作系统关系密切 | 跨平台,与浏览器相关 |
| 信息流 | 交互性低 | 交互密集 |


知识点5【ubuntu下的boa服务器搭建】


boa-0.94.13-src.tar.gz


1、将boa-0.94.13-src.tar.gz拷贝到ubuntu中 并解压到当前目录


![](https://img-blog.csdnimg.cn/dbe4f3f128054173b2c7d5bdbced578f.png)


在ubuntu中解压:tar -xvf boa-0.94.13-src.tar.gz


![](https://img-blog.csdnimg.cn/38ea554262414e49b85998b8991b0d70.png)


解压成功会生成:boa-0.94.13-src文件夹


cd boa-0.94.13-src


![](https://img-blog.csdnimg.cn/50b3006192e54926a56105cac44cded6.png)


 ls查看当前文件夹的内容 如下:


![](https://img-blog.csdnimg.cn/4eef5914ef7144c4be298e44bb67dd0d.png)


进入src目录


cd src


![](https://img-blog.csdnimg.cn/035a426fc480476e87989eecdf26132a.png)


 ls查看目录内容:


![](https://img-blog.csdnimg.cn/527c0214bc6146cfbe3dc824d709dc46.png)


 2、将来的boa服务器的目录结构分析


![](https://img-blog.csdnimg.cn/474fc4d3c8f64240884eabf1db87e18c.png)


创建boa目录:


mkdir ~/share/boa/boa -p


![](https://img-blog.csdnimg.cn/0a980155c805403a805a799427e179f2.png)


创建log目录


mkdir ~/share/boa/log


![](https://img-blog.csdnimg.cn/c704e622b802401cb1065fa05b189053.png)


创建www以及cgi-bin目录


mkdir ~/share/boa/www/cgi-bin -p


![](https://img-blog.csdnimg.cn/a8f83d39106241eb97dcf9740bb9c226.png)


3、将boa.conf服务器的配置文件以及mime.types 拷贝 到/home/edu/share/boa/boa目录中


boa.conf在boa-0.94.13-src目录下:


![](https://img-blog.csdnimg.cn/7a31bcfb170645059a3707cf15cfbb33.png)


将boa.conf拷贝到/home/edu/share/boa/boa下


cp boa.conf /home/edu/share/boa/boa


![](https://img-blog.csdnimg.cn/920af777c7b646ff96510ab126ef16e1.png)


将/etc/mime.types拷贝/home/edu/share/boa/boa下


sudo cp /etc/mime.types /home/edu/share/boa/boa/


![](https://img-blog.csdnimg.cn/b880e6835a8446d0aa331b02e35ef441.png)


4、配置boa服务器在启动的时候 去/home/edu/share/boa/boa下查找配置文件boa.conf


注意上述路径配置在boa-0.94.13-src/src/defines.h中


![](https://img-blog.csdnimg.cn/87b85ec3e95e4463835d4aea95a92b25.png)


编辑defines.h文件 


![](https://img-blog.csdnimg.cn/9ca37820f7c04c098d902ec53da6be05.png)


5、编译boa服务器的源码


1、./configure 生成Makefile


![](https://img-blog.csdnimg.cn/3a00a6729c134f29b0826e5fb494144a.png)


2、make编译源码


make


如果第一次make出现:make: bison:命令未找到。


解决方法:sudo apt-get install bison


如果第二次make出现:make: flex:命令未找到。


解决方法:sudo apt-get install flex


第三次make:就成功 就会在当前目录下 看到服务器boa可执行文件


![](https://img-blog.csdnimg.cn/646fe7ba85954189b5c768600074d109.png)


3、将当前路径下服务器boa拷贝到 /home/edu/share/boa/boa下:


cp boa /home/edu/share/boa/boa/


![](https://img-blog.csdnimg.cn/216c55e0de1c414ea252554286c2d8c0.png)


6、在log目录下添加error\_log access\_log两个文件


touch /home/edu/share/boa/log/error\_log


touch /home/edu/share/boa/log/access\_log


成功如下图


![](https://img-blog.csdnimg.cn/44589f368715450e98ba4da671b060a1.png)


7、在www目录下创建一个index.html网页


通过samba打开路径


![](https://img-blog.csdnimg.cn/0cbd0ece8b1d49e388deca60f063057f.png)


 编辑网页:代码如下



NZ2001 NZ2001 good good good!!!!

8、修改/home/edu/share/boa/boa/boa.conf

cd /home/edu/share/boa/boa/

用notepad++打开:

1、在48、49行将nobody、nogroup改成0

2、在62行将ErrorLog /root/arm-boa/log/error_log改成ErrorLog /home/edu/share/boa/log/error_log

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

edu/share/boa/boa/

用notepad++打开:

1、在48、49行将nobody、nogroup改成0

2、在62行将ErrorLog /root/arm-boa/log/error_log改成ErrorLog /home/edu/share/boa/log/error_log

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-nE6xRGoh-1715623773567)]
[外链图片转存中…(img-B8SsKmVB-1715623773568)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值