2012-09-25 115 views
1

我想了解如何直接(無庫)從多宿主機器(多接口)上的python發送DHCP請求。 我已經看過pydhcplib,但仍然不明白。Python dhcp客戶端

此代碼在特定接口(在我的情況下爲eth3 - 不分配IP)發送DHCP數據包,但它使用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() 

回答

2

截斷我假設你已經知道Advanced Interprocess Communication Tutorial

擾流板警報:如果您想直接跳到底線,請查看DHCP Query recipe

編輯:

特殊值INADDR_ANY(0.0.0.0,或在Python插座空字符串 '')不是一個IP地址。

「當一個地址被指定爲INADDR_ANY,系統解釋地址爲‘任何 有效地址’(的清單恆定 在< netinet/in.h中>定義)。」

從RFC 2131:

在使用DHCP用於初始配置 (客戶端的TCP/IP軟件已經前完全 配置)的客戶端的情況下,DHCP要求創造性地使用客戶端的的TCP/IP 軟件和RFC 1122的自由解釋。在配置IP地址爲 之前,TCP/IP 軟件應該接受並轉發所有IP數據包 傳遞到客戶端的硬件地址;在配置TCP/IP軟件之前,DHCP服務器和BOOTP中繼代理可能無法向不能接受硬件 單播數據報的客戶端發送DHCP消息。

假設你在已經配置了以太網接口並且有有效IP地址的系統上運行該程序。我不確定爲什麼你希望源IP地址爲0.0.0.0,但也許你可以使用ifconfig將接口IP設置爲0.0.0.0以獲得所需的效果。

或者您可以使用RAW套接字並自行構建IP和UDP標頭以包含任何內容。

+0

是的 - 我知道它的大部分。即使我的代碼(本質上)與您的示例非常相似 - 但示例僅提供單個界面。我仍然需要綁定到一個特定的接口(如我的例子),我想了解爲什麼源IP地址不是0.0.0.0(或如何設置它) –