教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

C++培訓之網絡編程高級應用—libnet 使用指南(二)

更新時間:2016年08月24日10時39分 來源:傳智播客C++培訓學院 瀏覽次數:

功能:

構造 tcp 數據包

參數:


sp:源端口號
dp:目的端口號
seq:序號
ack:ack 標記
control:控制標記
win:窗口大小
sum:校驗和,設為 0,libnet 自動填充
urg:緊急指針
len:tcp包長度
payload:負載,為給應用程序發(fā)送的文本內容,可設置為 NULL
payload_s:負載長度,或為 0
l:libnet_init() 返回的 libnet * 指針
ptag:協(xié)議標記,第一次組新的發(fā)送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協(xié)議標記

失?。?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:協(xié)議標記,第一次組新的發(fā)送包時,這里寫 0,同一個應用程序,下一次再組包時,這個位置的值寫此函數的返回值。

返回值:

成功:協(xié)議標記
失?。?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:上層協(xié)議

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

src:源 ip 地址

dst:目的ip地址

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

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

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

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

返回值:


成功:協(xié)議標記  

失敗:-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:協(xié)議標記,若為 0,建立一個新的協(xié)議

返回值:


成功:協(xié)議標記

失?。?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:協(xié)議地址格式,ETHERTYPE_IP( IP協(xié)議)

hln:硬件地址長度

pln:協(xié)議地址長度

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

sha:發(fā)送者硬件地址

spa:發(fā)送者協(xié)議地址

tha:目標硬件地址

tpa:目標協(xié)議地址

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

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

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

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

返回值:


成功:協(xié)議標記

失?。?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:上層協(xié)議類型

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

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

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

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

返回值:


成功:協(xié)議標記

失?。?1

int libnet_write(libnet_t * l);

功能:

發(fā)送數據包

參數:

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

返回值:

成功:發(fā)送數據包的長度
失?。悍祷?-1
使用實例

這里是在 ubuntu 下通過原始套接字組一個 udp 數據包,給 PC 機的網絡調試助手發(fā)送信息(對比:《原始套接字實例:發(fā)送 UDP 數據包》):


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <libnet.h>
  6. int main(int argc, char *argv[])
  7. {
  8.         char send_msg[1000] = "";
  9.         char err_buf[100] = "";
  10.         libnet_t *lib_net = NULL;
  11.         int lens = 0;
  12.         libnet_ptag_t lib_t = 0;
  13.         unsigned char src_mac[6] = {0x00,0x0c,0x29,0x97,0xc7,0xc1};//發(fā)送者網卡地址00:0c:29:97:c7:c1
  14.         unsigned char dst_mac[6] = {0x74,0x27,0xea,0xb5,0xff,0xd8};//接收者網卡地址‎74-27-EA-B5-FF-D8
  15.     char *src_ip_str = "192.168.31.163"; //源主機IP地址
  16.     char *dst_ip_str = "192.168.31.248"; //目的主機IP地址
  17.         unsigned long src_ip,dst_ip = 0;
  18.         lens = sprintf(send_msg, "%s", "this is for the udp test");
  19.         lib_net = libnet_init(LIBNET_LINK_ADV, "eth0", err_buf);        //初始化
  20.         if(NULL == lib_net)
  21.         {
  22.                 perror("libnet_init");
  23.                 exit(-1);
  24.         }
  25.         src_ip = libnet_name2addr4(lib_net,src_ip_str,LIBNET_RESOLVE);        //將字符串類型的ip轉換為順序網絡字節(jié)流
  26.         dst_ip = libnet_name2addr4(lib_net,dst_ip_str,LIBNET_RESOLVE);
  27.         lib_t = libnet_build_udp(        //構造udp數據包
  28.                                                                 8080,
  29.                                                                 8080,
  30.                                                                 8+lens,
  31.                                                                 0,
  32.                                                                 send_msg,
  33.                                                                 lens,
  34.                                                                 lib_net,
  35.                                                                 0
  36.                                                         );
  37.         lib_t = libnet_build_ipv4(        //構造ip數據包
  38.                                                                 20+8+lens,
  39.                                                                 0,
  40.                                                                 500,
  41.                                                                 0,
  42.                                                                 10,
  43.                                                                 17,
  44.                                                                 0,
  45.                                                                 src_ip,
  46.                                                                 dst_ip,
  47.                                                                 NULL,
  48.                                                                 0,
  49.                                                                 lib_net,
  50.                                                                 0
  51.                                                         );
  52.         lib_t = libnet_build_ethernet(        //構造以太網數據包
  53.                                                                         (u_int8_t *)dst_mac,
  54.                                                                         (u_int8_t *)src_mac,
  55.                                                                         0x800, // 或者,ETHERTYPE_IP
  56.                                                                         NULL,
  57.                                                                         0,
  58.                                                                         lib_net,
  59.                                                                         0
  60.                                                                 );
  61.         int res = 0;
  62.         res = libnet_write(lib_net);        //發(fā)送數據包
  63.         if(-1 == res)
  64.         {
  65.                 perror("libnet_write");
  66.                 exit(-1);
  67.         }
  68.         libnet_destroy(lib_net);        //銷毀資源
  69.         
  70.         printf("----ok-----\n");
  71.         return 0;
  72. }

復制代碼



 本文版權歸傳智播客C++培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓學院
首發(fā):http://xamj520.com/c/ 

0 分享到:
和我們在線交談!