目录

  • 参考文章:
  • 一、libnet库下载
  • 二、libnet库交叉编译安装
  • 三、应用程序交叉编译
  • 四、Ubuntu系统安装 libnet(非交叉编译)
  • 五、libnet使用
  • 六、开发板上测试

参考文章:

  1. libnet库下载、编译、示例、文档
  2. Linux 网络编程—— libnet 使用指南
  3. libnet 函数列表

一、libnet库下载

  1. https://github.com/libnet/libnet/releases

二、libnet库交叉编译安装

  1. 配置交叉编译环境
    普通用户和root用户下都需要配置

  2. 从 GitHub下载最新版本 libnet-master.tar.gz 或 libnet-1.2.tar.gz,解压缩到当前目录:

     tar -xzvf ./libnet-master.tar.gz -C ./
    
  3. 使用 ./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),不需要此步骤。

  4. 配置安装目录和交叉编译环境

    ./configure --prefix=xxx/xxx/install/ --host=arm-linux-gnueabihf
    

    配置结果:

  5. 编译

    make
    
  6. 安装

    sudo make install
    

    安装结果:
    在 install/lib/ 目录下生成如下文件:

  7. 错误说明
    如果报如下错误,是因为root用户下未配置交叉编译环境,配置后即可
    ../libtool: line 1719: arm-linux-gnueabihf-ranlib: command not found

  8. 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
    
  9. 将 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
    
  10. 开发板上添加库文件搜索路径
    打开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/
  1. 查看头文件及动态库路径
    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 选项指定不同的路径。

  2. 编译需要添加 -lnet 选项

    gcc test.c -o test -lnet
    
  3. 基于 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(非交叉编译)

  1. libnet 的安装

    sudo apt-get install libnet1-dev
    
  2. 应用程序编译

    gcc libnet_test.c -o libnet_test -lnet
    

五、libnet使用

参考:

  1. Linux 网络编程—— libnet 使用指南
  2. 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 移植及使用相关推荐

  1. Linux 网络编程—— libnet库详细使用指南

    概述 通过<原始套接字实例:发送 UDP 数据包>的学习,我们组 UDP 数据包时常考虑字节流顺序.校验和计算等问题,有时候会比较繁琐,那么,有没有一种更简单的方法呢?答案是:借助 lib ...

  2. linux网络编程——boa移植

    1.boa的介绍 boa webserver 是一个小巧高效的 web 服务器,可运行在 Unix 或 Linux 平台,支持 CGI ,源代码开放:是一个非常适合于嵌入式系统的单任务 http 服务 ...

  3. libnet编译linux,Linux 网络编程—— libnet 使用指南

    使用实例 这里是在 Ubuntu 下通过原始套接字组一个 udp 数据包,给 PC 机的网络调试助手发送信息(对比:<原始套接字实例:发送 UDP 数据包>): #include #inc ...

  4. 150集Linux网络编程培训视频吐血整理 | 网络基础

    学习视频来源:<黑马程序员 - Linux网络编程> 协议的概念 什么是协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则. 假设,A.B双方欲 ...

  5. Linux网络编程——千峰物联网笔记

    B站视频:千峰物联网学科linux网络编程 网址:https://www.bilibili.com/video/BV1RJ411B761?p=1 目录 第一章:计算机网络概述 1.1计算机网络发展简史 ...

  6. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  7. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  8. Linux网络编程实例分析

    最近由于工作原因需要温习一下Linux网络编程的部分基础知识,因此对之前写的Socket网络通信的代码进行了进一步优化和拓展,在不关闭一次Socket连接的基础上,对服务端加入循环读写的功能,同时加入 ...

  9. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  10. [Linux网络编程学习笔记]套接字地址结构

    好久没有看那Linux网络编程这本书了,今天看到了重点部分-TCP套接字.下面先来看看套接字的地址结构 Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构.在头文件<li ...

最新文章

  1. 爬虫之selenium替换user-agent
  2. python解初中题_用python解一道数独小题
  3. 《Language Implementation Patterns》之访问重写语法树
  4. 生生世世 —— schedule 的轮回(七)
  5. 关于完善Github repo里文档的规范做法
  6. 输入一个数,判断他是不是质数
  7. imread函数 matlab_【MATLAB图像处理学习】1.读取和显示图片
  8. Linux—微服务启停shell脚本编写模板
  9. Html Picture
  10. 小米宣布将停止MIUI全球Beta测试计划
  11. Linux 安装jdk8
  12. Linux 操作系统课程设计
  13. 【线性代数】P7 方阵的行列式伴随矩阵
  14. 1. ELK docker部署
  15. Adobe:Flash中存在高危零日漏洞
  16. 容器学习点点滴滴(三)
  17. 通过服务器给多台计算机装系统,局域网有100多台电脑怎么 同时装系统
  18. 关于iPad上百度网盘中压缩包下载不能找到的问题
  19. jenkins + svn + maven +svn 实现当SVN提交代码后自动触发打包部署
  20. 如何制作wordpress短代码

热门文章

  1. ArcGIS Zonal Statistics as Table 工具报错解决
  2. Ruby快速入门(30分钟)
  3. VS编译器 :LNK链接错误汇总:LNK2001 / LNK2005 / LNK2019 / LNK1120
  4. error LNK2005: _sprintf 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义
  5. Cisco Packet Tracer 思科模拟器交换机的链路聚合技术
  6. 华为android强刷系统下载地址,华为C8815官方rom固件刷机包下载_华为C8815系统强刷升级包...
  7. RFSoC应用笔记 - RF数据转换器 -15- API使用指南之Libmetal与结构体说明
  8. 六子棋人机程序Java版(附源码+设计思路)
  9. 计算100以内奇数和偶数的数量
  10. Linux无线网络文件传输慢,在Deepin 20下QQ和TIM不能下载上传文件及无线wifi速度慢的解决...