且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

郁闷的libnet API设计

更新时间:2022-09-02 15:05:17


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

(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)
{
    郁闷的libnet API设计郁闷的libnet API设计

    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 */

    郁闷的libnet API设计郁闷的libnet API设计

}

(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)
{
    郁闷的libnet API设计郁闷的libnet API设计

    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 */

    郁闷的libnet API设计郁闷的libnet API设计
}

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

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2006/02/06/325888.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)