看以下两个函数的源代码:

(1)构建ipv4 header的函数
libnet_ptag_t
libnet_build_ipv4(u_int16_t len, u_int8_t tos, u_int16_t id, u_int16_t frag,
u_int8_t ttl, u_int8_t prot, u_int16_t 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)
{
    dot.gifdot.gif

    ip_hdr.ip_tos        
=  tos;                        /*  IP tos  */
    ip_hdr.ip_len        
=  htons(h);                   /*  total length  */
    ip_hdr.ip_id         
=  htons(id);                  /*  IP ID  */
    ip_hdr.ip_off        
=  htons(frag);                /*  fragmentation flags  */
    ip_hdr.ip_ttl        
=  ttl;                        /*  time to live  */
    ip_hdr.ip_p          
=  prot;                       /*  transport protocol  */
    ip_hdr.ip_sum        
=  (sum  ?  htons(sum) :  0 );     /*  checksum  */
    ip_hdr.ip_src.s_addr 
=  src;                        /*  source ip  */
    ip_hdr.ip_dst.s_addr 
=  dst;                        /*  destination ip  */

    dot.gifdot.gif

}

(2)构建udp header的函数
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)
{
    dot.gifdot.gif

    udp_hdr.uh_sport   
=  htons(sp);              /*  source port  */
    udp_hdr.uh_dport   
=  htons(dp);              /*  destination port  */
    udp_hdr.uh_ulen    
=  htons(h);               /*  total length of UDP packet */
    udp_hdr.uh_sum     
=  (sum  ?  htons(sum) :  0 ); /*  checksum  */

    dot.gifdot.gif
}

其中,第一个函数中,ip参数需要以网络字节序传入,第二个函数中,端口参数需要以本机字节序传入。真是一个别扭啊。写程序,又是抓包,又是打印字节,折腾了很长时间才确定不是我的代码有问题,而是libnet1.1.*有缺陷。

转载于:https://www.cnblogs.com/xiaotie/archive/2006/02/06/325888.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐