Python dhcp客户端

时间:2012-09-25 09:57:02

标签: python udp dhcp

我正在尝试学习如何在多宿主机器(多个接口)上直接(没有库)从python发送DHCP请求。 我看过pydhcplib,但仍然没有得到它。

此代码在特定接口上发送DHCP数据包(在我的情况下为eth3 - 未分配IP),但它使用eth0 IP地址发送。如何将我的src IP更改为0.0.0.0? 在此示例中截断了dhcp-message

LOCAL_PORT=68
SERVER_PORT=67
LOCAL_IP="0.0.0.0"
BCAST_IP="255.255.255.255"
LISTEN_DEV="eth3"
MSG_SIZE=2048
Conn=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Conn.settimeout(5)
Conn.setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,LISTEN_DEV+'\0')
Conn.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
Conn.bind((LOCAL_IP, LOCAL_PORT))
# Create DHCP-Discovery
msg="010106003f7d1664......"
Conn.sendto(msg.decode("hex"),(BCAST_IP,SERVER_PORT))
received = Conn.recv(MSG_SIZE)
Conn.close()

1 个答案:

答案 0 :(得分:2)

我假设您已经了解Advanced Interprocess Communication Tutorial

剧透警告:如果您想直接跳到底线,请查看DHCP Query recipe

编辑:

特殊值INADDR_ANY(0.0.0.0,或python套接字中的空字符串')不是IP地址。

  

“将地址指定为INADDR_ANY(清单常量)   在<中定义netinet / in.h>),系统将地址解释为'any   有效地址'。“

来自RFC 2131:

  

如果客户端使用DHCP进行初始配置   (在客户端的TCP / IP软件完全之前   配置),DHCP需要创造性地使用客户端的TCP / IP   软件和RFC 1122的自由解释.TCP / IP   软件应该接受并向IP层转发任何IP数据包   在IP地址之前传送到客户端的硬件地址   配置; DHCP服务器和BOOTP中继代理可能无法   将DHCP消息传递给无法接受硬件的客户端   配置TCP / IP软件之前的单播数据报。

据推测,您在已配置以太网接口且具有有效IP地址的系统上运行此程序。我不确定为什么你希望源IP地址为0.0.0.0,但也许你可以使用ifconfig将接口IP设置为0.0.0.0以获得你想要的效果。

或者您可以使用RAW套接字并自己构建IP和UDP标头以包含任何内容。

相关问题