更新時間:2016年08月24日10時33分 來源:傳智播客C++培訓(xùn)學(xué)院 瀏覽次數(shù):
概述
通過《原始套接字實例:發(fā)送 UDP 數(shù)據(jù)包》的學(xué)習(xí),我們組 UDP 數(shù)據(jù)包時常考慮字節(jié)流順序、校驗和計算等問題,有時候會比較繁瑣,那么,有沒有一種更簡單的方法呢?答案是:借助 libnet 函數(shù)庫。 libnet 是一個小型的接口函數(shù)庫,主要用 C 語言寫成,提供了低層網(wǎng)絡(luò)數(shù)據(jù)包的構(gòu)造、處理和發(fā)送功能。 libnet 的開發(fā)目的是:建立一個簡單統(tǒng)一的網(wǎng)絡(luò)編程接口以屏蔽不同操作系統(tǒng)底層網(wǎng)絡(luò)編程的差別,使得程序員將精力集中在解決關(guān)鍵問題上。 libnet 庫提供的接口函數(shù)包含 15 種數(shù)據(jù)包生成器和兩種數(shù)據(jù)包發(fā)送器(IP 層和數(shù)據(jù)鏈路層)。 1)內(nèi)存管理(分配和釋放)函數(shù) |
利用libnet函數(shù)庫開發(fā)應(yīng)用程序的基本步驟:
1)數(shù)據(jù)包內(nèi)存初始化
2)構(gòu)造數(shù)據(jù)包
3)發(fā)送數(shù)據(jù)
4)釋放資源
以發(fā)送 UDP 數(shù)據(jù)包為例,流程圖如下:
這里需要注意的是組包的順序,由上層再到底層,這里為 udp -> ip -> mac,不能反過來。
以下函數(shù)的使用需要包含頭文件: libnet.h
libnet_t *libnet_init(int injection_type, char *device, char *err_buf);
功能:
數(shù)據(jù)包內(nèi)存初始化及環(huán)境建立
參數(shù):
injection_type:構(gòu)造的類型
LIBNET_LINK,鏈路層LIBNET_RAW4,網(wǎng)絡(luò)接口層(網(wǎng)絡(luò)層)
LIBNET_LINK_ADV,鏈路層高級版本
LIBNET_RAW4_ADV, 網(wǎng)絡(luò)層高級版本
device:網(wǎng)絡(luò)接口,如 "eth0",或 IP 地址,亦可為 NULL (自動查詢搜索)
err_buf:存放出錯的信息
返回值:
成功:一個 libnet * 類型的指針,后面的操作都得使用這個指針
失敗:NULL
void libnet_destroy(libnet_t *l);
功能:
釋放資源
參數(shù):
l:libnet_init() 返回的 libnet * 指針
返回值:
無
char* libnet_addr2name4(u_int32_t in, u_int8_t use_name);
功能:
將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成點分十進(jìn)制數(shù)串
參數(shù):
in:網(wǎng)絡(luò)字節(jié)序的 ip 地址
use_name:
LIBNET_RESOLVE, 對應(yīng)主機(jī)名LIBNET_DONT_RESOLVE,對應(yīng)點分十進(jìn)制 IPv4 地址
返回值:
成功:點分十進(jìn)制 ip 地址
失?。篘ULL
u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name);
功能:
將點分十進(jìn)制數(shù)串轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序 ip 地址
參數(shù):
l:libnet_init() 返回的 libnet * 指針
host_name:
LIBNET_RESOLVE, 對應(yīng)主機(jī)名LIBNET_DONT_RESOLVE,對應(yīng)點分十進(jìn)制 IPv4 地址
返回值:
成功:網(wǎng)絡(luò)字節(jié)序 ip 地址
失敗:-1
u_int32_t libnet_get_ipaddr4(libnet_t *l);
功能:
獲取接口設(shè)備 ip 地址
參數(shù):
l:libnet_init() 返回的 libnet * 指針
返回值:
成功:網(wǎng)絡(luò)字節(jié)序的 ip 地址
失?。?1
struct libnet_ether_addr* libnet_get_hwaddr(libnet_t *l);
功能:
獲取接口設(shè)備硬件地址
參數(shù):
l:libnet_init() 返回的 libnet * 指針
返回值:
成功:指向 MAC 地址的指針
失?。篘ULL
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);
功能:
構(gòu)造 udp 數(shù)據(jù)包
參數(shù):
sp: 源端口號
dp:目的端口號
len:udp 包總長度
sum:校驗和,設(shè)為 0,libnet 自動填充
payload:負(fù)載,為給應(yīng)用程序發(fā)送的文本內(nèi)容,沒有內(nèi)容時可設(shè)置為 NULL
payload_s:負(fù)載長度,給應(yīng)用程序發(fā)送文本內(nèi)容的長度,或為 0
l:libnet_init() 返回的 libnet * 指針
ptag:協(xié)議標(biāo)記,第一次組新的發(fā)送包時,這里寫 0,同一個應(yīng)用程序,下一次再組包時,這個位置的值寫此函數(shù)的返回值。
返回值:
成功:協(xié)議標(biāo)記
失?。?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 winu_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 );
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/c/