Linux网络编程:libnet 移植及使用
目录
- 参考文章:
- 一、libnet库下载
- 二、libnet库交叉编译安装
- 三、应用程序交叉编译
- 四、Ubuntu系统安装 libnet(非交叉编译)
- 五、libnet使用
- 六、开发板上测试
参考文章:
- libnet库下载、编译、示例、文档
- Linux 网络编程—— libnet 使用指南
- libnet 函数列表
一、libnet库下载
- https://github.com/libnet/libnet/releases
二、libnet库交叉编译安装
配置交叉编译环境
普通用户和root用户下都需要配置从 GitHub下载最新版本 libnet-master.tar.gz 或 libnet-1.2.tar.gz,解压缩到当前目录:
tar -xzvf ./libnet-master.tar.gz -C ./
使用 ./autogen.sh 生成 configure 脚本
需要的工具套件:autoconf (>=2.69)、automake (>=1.14)、libtool (>=2.4.2)
(1) 安装工具:sudo apt install autoconf automake libtool
(2) 进入libnet-master目录,生成 configure 脚本
cd libnet-master/
./autogen.sh
说明:如果下载的是 Releases版本(如:libnet-1.2.tar.gz),不需要此步骤。
配置安装目录和交叉编译环境
./configure --prefix=xxx/xxx/install/ --host=arm-linux-gnueabihf
配置结果:
编译
make
安装
sudo make install
安装结果:
在 install/lib/ 目录下生成如下文件:
错误说明
如果报如下错误,是因为root用户下未配置交叉编译环境,配置后即可
../libtool: line 1719: arm-linux-gnueabihf-ranlib: command not found
cd 进入 install 安装目录,打包lib目录下动态库文件(libnet.so libnet.so.9 libnet.so.9.0.0)
tar -zcvf libnet-1.2-install.tar.gz -C ./lib libnet.so libnet.so.9 libnet.so.9.0.0
将 libnet-1.2-install.tar.gz 压缩包拷贝到开发板上,解压
新建文件夹:/usr/local/lib/libnet , 然后解压到该文件夹中sudo mkdir /usr/local/lib/libnet
sudo tar -zxvf libnet-1.2-install.tar.gz -C /usr/local/lib/libnet
开发板上添加库文件搜索路径
打开ld.so.conf文件sudo vi /etc/ld.so.conf.d/libc.conf
在 /etc/ld.so.conf 文件中添加库的搜索路径
/usr/local/lib/libnet //根据自己的库路径添加
然后
ldconfig
生成/etc/ld.so.cache,ldconfig -v
查看ldconfig
三、应用程序交叉编译
交叉编译应用程序:需要加 -lnet 选项,并指定头文件及动态库路径
arm-linux-gnueabihf-gcc ./libnet_test.c -o ./libnet_test -lnet -I/xxx/include/ -L/xxx/lib/
查看头文件及动态库路径
Libnet 安装为一个库和一组包含文件。在您的程序中使用的主要包含文件是:#include <libnet.h>
要获得头文件和库文件的正确搜索路径,请使用标准pkg-config工具:
pkg-config --libs --static --cflags libnet
结果:
-I/usr/local/include -L/usr/local/lib -lnet
/usr/local/此处显示的路径为默认值。configure时,可以使用 --prefix 选项指定不同的路径。
编译需要添加 -lnet 选项
gcc test.c -o test -lnet
基于 GNU autotools 的项目,请在以下内容中使用
configure.ac
:# Check for required libraries PKG_CHECK_MODULES([libnet], [libnet >= 1.2])
并在您的
Makefile.am
:proggy_CFLAGS = $(libnet_CFLAGS) proggy_LDADD = $(libnet_LIBS)
四、Ubuntu系统安装 libnet(非交叉编译)
libnet 的安装
sudo apt-get install libnet1-dev
应用程序编译
gcc libnet_test.c -o libnet_test -lnet
五、libnet使用
参考:
- Linux 网络编程—— libnet 使用指南
- libnet 函数列表
六、开发板上测试
使用libnet库发送udp包测试程序(libnet_test.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libnet.h> int main(int argc, char *argv[])
{ char send_msg[1000] = ""; char err_buf[100] = ""; libnet_t *lib_net = NULL; int lens = 0; libnet_ptag_t lib_t = 0; unsigned char src_mac[6] = {0x00,0x0a,0x35,0x00,0x10,0x01}; //发送者网卡地址unsigned char dst_mac[6] = {0xa4,0xbb,0x6d,0xc3,0x1d,0xce}; //接收者网卡地址char *src_ip_str = "192.168.10.10"; //源主机IP地址 char *dst_ip_str = "192.168.10.201"; //目的主机IP地址 unsigned long src_ip,dst_ip = 0; lens = sprintf(send_msg, "%s", "this is for the udp test");lib_net = libnet_init(LIBNET_LINK_ADV, "eth0", err_buf); //初始化 if(NULL == lib_net) { perror("libnet_init"); exit(-1); } src_ip = libnet_name2addr4(lib_net,src_ip_str,LIBNET_RESOLVE); //将字符串类型的ip转换为顺序网络字节流 dst_ip = libnet_name2addr4(lib_net,dst_ip_str,LIBNET_RESOLVE); lib_t = libnet_build_udp( //构造udp数据包 8080, 8080, 8+lens, 0, send_msg, lens, lib_net, 0 ); lib_t = libnet_build_ipv4( //构造ip数据包 20+8+lens, 0, 500, 0, 10, 17, 0, src_ip, dst_ip, NULL, 0, lib_net, 0 ); lib_t = libnet_build_ethernet( //构造以太网数据包 (u_int8_t *)dst_mac, (u_int8_t *)src_mac, 0x800,// 或者,ETHERTYPE_IP NULL,0, lib_net, 0 ); int res = 0; res = libnet_write(lib_net); //发送数据包 if(-1 == res) { perror("libnet_write"); exit(-1); } libnet_destroy(lib_net); //销毁资源 printf("----ok-----\n"); return 0; }
交叉编译:
arm-linux-gnueabihf-gcc ./libnet_test.c -o ./libnet_test -lnet -I/home/osrc/Projects/tools/libnet/install/include/ -L/home/osrc/Projects/tools/libnet/install/lib
在开发板上运行,需要root账户权限:
sudo ./libnet_test
在PC机上使用网络调试助手接收udp数据,结果如下:
Linux网络编程:libnet 移植及使用相关推荐
- Linux 网络编程—— libnet库详细使用指南
概述 通过<原始套接字实例:发送 UDP 数据包>的学习,我们组 UDP 数据包时常考虑字节流顺序.校验和计算等问题,有时候会比较繁琐,那么,有没有一种更简单的方法呢?答案是:借助 lib ...
- linux网络编程——boa移植
1.boa的介绍 boa webserver 是一个小巧高效的 web 服务器,可运行在 Unix 或 Linux 平台,支持 CGI ,源代码开放:是一个非常适合于嵌入式系统的单任务 http 服务 ...
- libnet编译linux,Linux 网络编程—— libnet 使用指南
使用实例 这里是在 Ubuntu 下通过原始套接字组一个 udp 数据包,给 PC 机的网络调试助手发送信息(对比:<原始套接字实例:发送 UDP 数据包>): #include #inc ...
- 150集Linux网络编程培训视频吐血整理 | 网络基础
学习视频来源:<黑马程序员 - Linux网络编程> 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲 ...
- Linux网络编程——千峰物联网笔记
B站视频:千峰物联网学科linux网络编程 网址:https://www.bilibili.com/video/BV1RJ411B761?p=1 目录 第一章:计算机网络概述 1.1计算机网络发展简史 ...
- Linux网络编程--进程间通信(一)
进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...
- Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型
Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...
- Linux网络编程实例分析
最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...
- Linux网络编程必看书籍推荐
首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...
- [Linux网络编程学习笔记]套接字地址结构
好久没有看那Linux网络编程这本书了,今天看到了重点部分-TCP套接字.下面先来看看套接字的地址结构 Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构.在头文件<li ...
最新文章
- 爬虫之selenium替换user-agent
- python解初中题_用python解一道数独小题
- 《Language Implementation Patterns》之访问重写语法树
- 生生世世 —— schedule 的轮回(七)
- 关于完善Github repo里文档的规范做法
- 输入一个数,判断他是不是质数
- imread函数 matlab_【MATLAB图像处理学习】1.读取和显示图片
- Linux—微服务启停shell脚本编写模板
- Html Picture
- 小米宣布将停止MIUI全球Beta测试计划
- Linux 安装jdk8
- Linux 操作系统课程设计
- 【线性代数】P7 方阵的行列式伴随矩阵
- 1. ELK docker部署
- Adobe:Flash中存在高危零日漏洞
- 容器学习点点滴滴(三)
- 通过服务器给多台计算机装系统,局域网有100多台电脑怎么 同时装系统
- 关于iPad上百度网盘中压缩包下载不能找到的问题
- jenkins + svn + maven +svn 实现当SVN提交代码后自动触发打包部署
- 如何制作wordpress短代码
热门文章
- ArcGIS Zonal Statistics as Table 工具报错解决
- Ruby快速入门(30分钟)
- VS编译器 :LNK链接错误汇总:LNK2001 / LNK2005 / LNK2019 / LNK1120
- error LNK2005: _sprintf 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义
- Cisco Packet Tracer 思科模拟器交换机的链路聚合技术
- 华为android强刷系统下载地址,华为C8815官方rom固件刷机包下载_华为C8815系统强刷升级包...
- RFSoC应用笔记 - RF数据转换器 -15- API使用指南之Libmetal与结构体说明
- 六子棋人机程序Java版(附源码+设计思路)
- 计算100以内奇数和偶数的数量
- Linux无线网络文件传输慢,在Deepin 20下QQ和TIM不能下载上传文件及无线wifi速度慢的解决...