Python dhcp客户端

Python dhcp客户端,python,udp,dhcp,Python,Udp,Dhcp,我试图学习如何在多宿主机器(多接口)上直接(无库)从python发送DHCP请求。 我看过pydhcplib,但还是不明白 这段代码在特定接口上发送DHCP数据包(在我的例子中是eth3-没有分配IP),但它使用eth0 IP地址发送。如何将src IP更改为0.0.0.0? 在本例中,dhcp消息被截断 LOCAL_PORT=68 SERVER_PORT=67 LOCAL_IP="0.0.0.0" BCAST_IP="255.255.255.255" LISTEN_DEV="eth3" MSG

我试图学习如何在多宿主机器(多接口)上直接(无库)从python发送DHCP请求。 我看过pydhcplib,但还是不明白

这段代码在特定接口上发送DHCP数据包(在我的例子中是eth3-没有分配IP),但它使用eth0 IP地址发送。如何将src IP更改为0.0.0.0? 在本例中,dhcp消息被截断

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()

我想你已经知道这件事了

剧透警报:如果你想直接跳到底线,请看一下

编辑:

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

“当地址被指定为INADDR_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,以获得您想要的效果


或者,您可以使用原始套接字,自己构建IP和UDP报头来包含任何内容。

是的,我知道大部分内容。即使是我的代码(本质上)也和您的示例非常相似——但示例只提供了一个接口。我仍然需要绑定到一个特定的接口(如我的示例中所示),我想了解为什么源IP地址不是0.0.0.0(或者如何设置它)