如何从DHCP数据包中提取客户端数据?

时间:2016-06-23 06:55:00

标签: c sockets network-programming

我需要开发显示类似内容的路由器软件(注意:这篇文章与网络编程有关):

enter image description here

我通过Wireshark捕获了DHCP数据包,发现它包含了我需要显示的所有细节。数据如下所示:

enter image description here

我用dhcpdump和tcpdump工具检查了它。

me@linux:$ sudo dhcpdump -i wlp6s0

我感兴趣的部分输出是:

  TIME: 2016-06-23 12:20:50.976
    IP: 10.42.0.1 (b0:c0:90:69:72:57) > 10.42.0.99 (fc:64:ba:1b:40:e5)
    OP: 2 (BOOTPREPLY)
 HTYPE: 1 (Ethernet)
  HLEN: 6
  HOPS: 0
   XID: e277d896
  SECS: 0
 FLAGS: 0
CIADDR: 0.0.0.0
YIADDR: 10.42.0.99
SIADDR: 10.42.0.1
GIADDR: 0.0.0.0
CHADDR: fc:64:ba:1b:40:e5:00:00:00:00:00:00:00:00:00:00
 SNAME: .
 FNAME: .
OPTION:  53 (  1) DHCP message type         5 (DHCPACK)
OPTION:  54 (  4) Server identifier         10.42.0.1
OPTION:  51 (  4) IP address leasetime      3600 (60m)
OPTION:  58 (  4) T1                        1800 (30m)
OPTION:  59 (  4) T2                        3150 (52m30s)
OPTION:   1 (  4) Subnet mask               255.255.255.0
OPTION:  28 (  4) Broadcast address         10.42.0.255
OPTION:   6 (  4) DNS server                10.42.0.1
OPTION:   3 (  4) Routers                   10.42.0.1
---------------------------------------------------------------------------

但是如果不使用这些工具(这些工具无法添加到路由器板上),如何以编程方式从dhcp数据包(或这些工具如何提取信息)中提取客户端数据,如MAC地址,IP地址和其他信息(如果可能在C)?

1 个答案:

答案 0 :(得分:0)

假设您的DHCP服务器没有提供任何获取所需信息的方法,您可以使用以下类型的套接字:

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

有了它,您将能够看到所有ETH数据包,并像wireshark一样处理它们。您将需要一些OSI层(ETH2,IP,UDP和DHCP)的知识,以便处理数据包中的标头和内容。