import tkinter as tk
from tkinter import ttk
import threading
import socket
import struct
class DHCP_Server_GUI:
def __init__(self, root):
self.root = root
self.root.title("DHCP 服务器")
self.root.geometry("400x300")
self.start_button = ttk.Button(self.root, text="启动服务器", command=self.start_server)
self.start_button.pack(pady=20)
self.stop_button = ttk.Button(self.root, text="停止服务器", command=self.stop_server, state=tk.DISABLED)
self.stop_button.pack(pady=10)
self.status_label = ttk.Label(self.root, text="服务器未启动", font=("Arial", 12))
self.status_label.pack(pady=10)
self.client_info_treeview = ttk.Treeview(self.root, columns=("IP", "MAC"), show="headings")
self.client_info_treeview.heading("IP", text="IP 地址")
self.client_info_treeview.heading("MAC", text="MAC 地址")
self.client_info_treeview.pack(pady=10)
self.server_socket = None
self.server_thread = None
self.stop_event = threading.Event()
def start_server(self):
self.start_button.config(state=tk.DISABLED)
self.stop_button.config(state=tk.NORMAL)
self.status_label.config(text="服务器运行中", foreground="green")
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.server_socket.bind(('192.168.1.5', 67))
# self.server_socket.bind(('0.0.0.0', 67))
self.server_thread = threading.Thread(target=self.run_server)
self.server_thread.start()
def stop_server(self):
self.start_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
self.status_label.config(text="服务器已停止", foreground="red")
self.stop_event.set()
self.server_thread.join()
self.server_socket.close()
def run_server(self):
while not self.stop_event.is_set():
try:
data, addr = self.server_socket.recvfrom(1024)
print("data===",data,len(data))
print("addr===",addr)
request_packet = self.parse_dhcp_packet(data)
print("request_packet===",request_packet,len(request_packet))
# 判断是否是DHCP报文
if request_packet[0] == 1:
# 创建DHCP Offer报文
offer_packet = self.create_dhcp_offer(request_packet)
# decimal_value = struct.unpack('!BB', request_packet[11:12])
print("offer_packet===",offer_packet,len(offer_packet))
self.server_socket.sendto(offer_packet, addr)
self.update_client_info(addr[0], request_packet[11:12])
except socket.timeout:
continue
def parse_dhcp_packet(self, data):
dhcp_format = '!BBBBLHHLLLL16s64s128sBBBBBB'
# dhcp_format = '!1s1s1s1s4s2s2s4s4s4s4s2B8B16B4s'
print("dhcp_format==",dhcp_format,len(dhcp_format))
# 你需要确保提供给 struct.unpack 函数的数据长度与格式字符串所需的长度一致。
# 你还需要确保格式字符串 dhcp_format 的正确性。请确保该格式字符串与你要解包的数据的结构相匹配,包括字段的数量、类型和顺序。
request_packet = struct.unpack(dhcp_format, data)
# print("request_packet--",len(request_packet),request_packet)
return request_packet
def create_dhcp_offer(self,discover_packet):
discover_packet = {
'xid': b'\x01\x02\x03\x04',
'chaddr': b'\x00\x11\x22\x33\x44\x55\x66',
}
# 构建 DHCP Offer 报文字段值
# mac_address = '00:11:22:33:44:55'
# mac_address_bytes = bytes.fromhex(mac_address.split(':',''))
# mac_address_bytes = bytes.fromhex(''.join(mac_address.split(':')))
mac_address_bytes = discover_packet['chaddr']
print("mac_address_bytes==",mac_address_bytes)
print("(mac_address_bytes') ===",int.from_bytes(mac_address_bytes, 'big'))
print("int.from_bytes(discover_packet['xid'], 'big') ===",int.from_bytes(discover_packet['xid'], 'big'))
print("*map(int, socket.inet_aton('192.168.1.5'))==",*map(int, socket.inet_aton('192.168.1.5')))
offer_packet = struct.pack(
# '!BBBB I 4s HH 4s4s4s4s 16s 64s 128s',
'!BBBBIHH4s4s 4s4s 16s 64s 128sI',
# '!BBBBI4sHH4 s4s4s4s16s64s128sI',
2, # OP: 2 (Boot Reply)
1, # HTYPE: 1 (Ethernet)
6, # HLEN: 6 (MAC Address Length)
0,
# HOPS: 0 (Hops) I
int.from_bytes(discover_packet['xid'], 'big'), # XID: 4 bytes (Transaction ID)
# 4s
0, # SECS: 2 bytes (Seconds)
0, # FLAGS: 2 bytes (Flags)
b'\x00\x00\x00\x00', # CIADDR: 4 bytes (Client IP Address)
b'\x00\x00\x00\x00', # YIADDR: 4 bytes (Your IP Address)
# # HH
b'\x00\x00\x00\x00', # SIADDR: 4 bytes (Server IP Address)
b'\x00\x00\x00\x00', # GIADDR: 4 bytes (Gateway IP Address)
# # 16s
mac_address_bytes, # CHADDR: 16 bytes (Client MAC Address)
b'\x00' * 64, # SNAME: 64 bytes (Server Name)
b'\x00' * 128, # FILE: 128 bytes (Boot File Name)
0x63825363, # OPT: 4 bytes (Magic Cookie)
)
offer_packet += struct.pack(
'!BBB', # DHCP Option: 53 (DHCP Message Type)
53, # Option Code
1, # Option Length
2, # Option Value (Offer)
)
offer_packet += struct.pack(
'!BBBBBB', # DHCP Option: 54 (DHCP Server Identifier)
54, # Option Code
4, # Option Length
*map(int, socket.inet_aton('192.168.1.5')), # Option Value (Server IP Address)
)
offer_packet += struct.pack(
'!BBBBBB', # DHCP Option: 50 (Requested IP Address)
50, # Option Code
4, # Option Length
*map(int, socket.inet_aton('192.168.1.6')), # Option Value (Client Requested IP Address)
)
offer_packet += struct.pack(
'!B', # DHCP Option: 255 (End of Options)
255, # Option Code
)
# 输出 DHCP Offer 报文字段值
print(offer_packet)
return offer_packet
def update_client_info(self, ip, mac):
self.client_info_treeview.insert("", tk.END, values=(ip, mac))
if __name__ == "__main__":
root = tk.Tk()
dhcp_server_gui = DHCP_Server_GUI(root)
root.mainloop()
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
使用Python网络编程实现DHCP服务器,在理解 DHCP 协议的基础上,编写一个 DHCP 服务器,为网络中的主机动态分配 IP 地址等信息。 2. 设计语言:Python、C/C++。 3. 原理:根据 DHCP 工作过程,即 DHCP 正常工作的所需的几种 DHCP报文,在收到的客户的 DHCP 报文之后,服务器正确构造相应的 DHCP 响应报文并发送给 DHCP 客户。 4. 技术难点:分析收到 DHCP 客户发送的报文并正确发送响应 DHCP 报文。最终效果:计算机能从运行的 DHCP 服务器程序获取 IP 地址等信息。
资源推荐
资源详情
资源评论
收起资源包目录
DHCP.rar (2个子文件)
DHCPClient.py 3KB
DHCPServer.py 8KB
共 2 条
- 1
资源评论
码上有前
- 粉丝: 1550
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功