日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

li.NET 是一個小型的接口函數庫,主要用 C 語言寫成,提供了低層網絡數據包的構造、處理和發送功能。

libnet 的開發目的是:建立一個簡單統一的網絡編程接口以屏蔽不同操作系統底層網絡編程的差別,使得程序員將精力集中在解決關鍵問題上。

libnet 庫提供的接口函數包含 15 種數據包生成器和兩種數據包發送器(IP 層和數據鏈路層)。
提供的接口函數包括:

1)內存管理(分配和釋放)函數

2)地址解析函數

3)各種協議類型的數據包構造函數

4)數據包發送函數(IP層和鏈路層)

5)一些輔助函數,如產生隨機數、錯誤報告、端口列表管理等

詳情請看《libnet 函數列表》。

libnet 的安裝

Linux 網絡編程之如何使用函數庫libnet詳解

 

流程

利用libnet函數庫開發應用程序的基本步驟:

1)數據包內存初始化

2)構造數據包

3)發送數據

4)釋放資源

以發送 UDP 數據包為例,流程圖如下:

Linux 網絡編程之如何使用函數庫libnet詳解

 

這里需要注意的是組包的順序,由上層再到底層,這里為 udp -> ip -> mac,不能反過來。

注:需要C/C++ linux高級服務器架構師學習資料私信“資料”(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等),免費分享

Linux 網絡編程之如何使用函數庫libnet詳解

 

常用函數介紹

以下函數的使用需要包含頭文件: libnet.h

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

void libnet_destroy(libnet_t *l);

功能:

釋放資源

參數:

l:libnet_init() 返回的 libnet * 指針

返回值:

char* libnet_addr2name4(u_int32_t in, u_int8_t use_name);

功能:

將網絡字節序轉換成點分十進制數串

參數:

in:網絡字節序的 ip 地址

use_name:

LIBNET_RESOLVE, 對應主機名

LIBNET_DONT_RESOLVE,對應點分十進制 IPv4 地址

返回值:

成功:點分十進制 ip 地址

失敗:NULL

u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name);

功能:

將點分十進制數串轉換為網絡字節序 ip 地址

參數:

l:libnet_init() 返回的 libnet * 指針

host_name:

LIBNET_RESOLVE, 對應主機名

LIBNET_DONT_RESOLVE,對應點分十進制 IPv4 地址

 

返回值:

成功:網絡字節序 ip 地址

失敗:-1

u_int32_t libnet_get_ipaddr4(libnet_t *l);

功能:

獲取接口設備 ip 地址

參數:

l:libnet_init() 返回的 libnet * 指針

返回值:

成功:網絡字節序的 ip 地址

失敗:-1

struct libnet_ether_addr* libnet_get_hwaddr(libnet_t *l);

功能:

獲取接口設備硬件地址

參數:

l:libnet_init() 返回的 libnet * 指針

返回值:

成功:指向 MAC 地址的指針

失敗:NULL

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 數據包

參數:

sp: 源端口號

dp:目的端口號

len:udp 包總長度

sum:校驗和,設為 0,libnet 自動填充

payload:負載,為給應用程序發送的文本內容,沒有內容時可設置為 NULL

payload_s:負載長度,給應用程序發送文本內容的長度,或為 0

l:libnet_init() 返回的 libnet * 指針

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

libnet_ptag_t libnet_build_tcp(

u_int16_t sp, u_int16_t dp,

u_int32_t seq, u_int32_t ack,

u_int8_t control, u_int16_t win

u_int16_t sum, u_int16_t urg,

u_int16_t len, u_int8_t *payload,

u_int32_t payload_s, libnet_t *l,

libnet_ptag_t ptag );

功能:

構造 tcp 數據包

參數:

sp:源端口號

dp:目的端口號

seq:序號

ack:ack 標記

control:控制標記

win:窗口大小

sum:校驗和,設為 0,libnet 自動填充

urg:緊急指針

len:tcp包長度

payload:負載,為給應用程序發送的文本內容,可設置為 NULL

payload_s:負載長度,或為 0

l:libnet_init() 返回的 libnet * 指針

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

libnet_ptag_t libnet_build_tcp_options(

u_int8_t *options,

u_int32_t options_s,

libnet_t *l,

libnet_ptag_t ptag );

功能:

構造 tcp 選項數據包

參數:

options:tcp 選項字符串

options_s:選項長度

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

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(這里通常寫 NULL)

payload_s:負載長度,或為 0(這里通常寫 0 )

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

libnet_ptag_t libnet_build_ipv4_options(

u_int8_t*options, u_int32_t options,

libnet_t*l, libnet_ptag_t ptag);

功能:

構造 IPv4 選項數據包

參數:

options:tcp 選項字符串

options_s:選項長度

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

ptag:協議標記,若為 0,建立一個新的協議

返回值:

成功:協議標記

失敗:-1

libnet_ptag_t libnet_build_arp(

u_int16_t hrd, u_int16_t pro,

u_int8_t hln, u_int8_t pln,

u_int16_t op, u_int8_t *sha,

u_int8_t *spa, u_int8_t *tha,

u_int8_t *tpa, u_int8_t *payload,

u_int32_t payload_s, libnet_t *l,

libnet_ptag_t ptag );

功能:

構造 arp 數據包

參數:

hrd:硬件地址格式,ARPHRD_ETHER(以太網)

pro:協議地址格式,ETHERTYPE_IP( IP協議)

hln:硬件地址長度

pln:協議地址長度

op:ARP協議操作類型(1:ARP請求,2:ARP回應,3:RARP請求,4:RARP回應)

sha:發送者硬件地址

spa:發送者協議地址

tha:目標硬件地址

tpa:目標協議地址

payload:負載,可設置為 NULL(這里通常寫 NULL)

payload_s:負載長度,或為 0(這里通常寫 0 )

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

libnet_ptag_t libnet_build_ethernet(

u_int8_t*dst, u_int8_t *src,

 

u_int16_ttype, u_int8_t*payload,

 

u_int32_tpayload_s, libnet_t*l,

 

libnet_ptag_t ptag );

功能:

構造一個以太網數據包

參數:

dst:目的 mac

 

src:源 mac

 

type:上層協議類型

 

payload:負載,即附帶的數據,可設置為 NULL(這里通常寫 NULL)

 

payload_s:負載長度,或為 0(這里通常寫 0 )

 

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

 

ptag:協議標記,第一次組新的發送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協議標記

失敗:-1

int libnet_write(libnet_t * l);

功能:

發送數據包

參數:

l:libnet 句柄,libnet_init() 返回的 libnet * 指針

返回值:

成功:發送數據包的長度

失敗:返回 -1

使用實例

#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,0x0c,0x29,0x97,0xc7,0xc1};//發送者網卡地址00:0c:29:97:c7:c1
unsigned char dst_mac[6] = {0x74,0x27,0xea,0xb5,0xff,0xd8};//接收者網卡地址‎74-27-EA-B5-FF-D8
char *src_ip_str = "192.168.31.163"; //源主機IP地址
char *dst_ip_str = "192.168.31.248"; //目的主機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;
編譯代碼時,需要加上 -lnet:
Linux 網絡編程之如何使用函數庫libnet詳解

分享到:
標簽:Linux
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定