Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5232字,纯文字阅读大概需要8分钟。
内容图文
![Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现](/upload/InfoBanner/zyjiaocheng/1198/180b0eb4a154426998f1eace7de264e0.jpg)
BOOTP实现 / BOOTP Implement
目录
Note: 理论部分请参考文末相关阅读链接
服务器建立步骤主要有:
(1) 设定服务器IP,传送ip(offer_ip),服务端口68,客户端口67;
(2) 建立send_socket/UDP,广播模式允许复用,绑定到服务器ip,客户端端口;
(3) 建立主循环,建立recv_socket进行监听广播地址和客户端口;
(4) Recv_socket进行广播接收,筛选收到的广播报文,对有效报文进行解码;
(5) 解码报文获取相应信息,xid,mac_id等;
(6) 加码回传报文,填入收到的xid,mac_id,server ip,offer ip, 文件名等;
(7) 利用send_socket向68端口以广播形式回复报文;
(8) 判断待传文件是否还有未传送的,是则回到循环等待下一个有效广播请求
Note: BOOTP_CodeC 中的加码实现可参考 BOOTP 加码的 Python 实现部分内容
1 import socket 2 import struct 3 import os 4 from BOOTP_CodeC import ServerCodeC 5 SERVERNAME = ‘Bootpserver‘ 6 7class BOOTPServer(): 8def__init__(self): 9 self.server_ip = ‘127.0.0.1‘10 self.offer_ip = ‘127.0.0.8‘11 self.server_port = 68 # Respond client via this port12 self.client_port = 67 # Receive client data via this port13 self.send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 14 self.send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) 15 self.send_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 16#self.send_sock.bind((self.server_ip, self.client_port))17 self.file_bin = [‘secondboot.b3‘, ‘files4.rc‘] 1819def requestCheck(self, m): 20ifnot ( 21 m[‘op‘] == b‘\x01‘and# OP22 m[‘htype‘] == b‘\x01‘and# HTYPE23 m[‘hlen‘] == b‘\x06‘and# HLEN24 m[‘hops‘] == b‘\x00‘and# HOPS25 m[‘secs‘] == [b‘\x00‘, b‘\x00‘] and# SECS26 m[‘flags‘] == [b‘\x80‘, b‘\x00‘] and# FLAGS (broadcast)27 m[‘ciaddr‘] == ‘0.0.0.0‘and# Client IP Address28 m[‘yiaddr‘] == ‘0.0.0.0‘and# Your Client IP Address29 m[‘siaddr‘] == ‘0.0.0.0‘and# Server IP30 m[‘giaddr‘] == ‘0.0.0.0‘# Gateway IP31 ): 32return False 33ifnot ( 34 m[‘sname‘] == SERVERNAME or35 m[‘sname‘] == ‘‘): 36return False 37return True 3839def server_start(self): 40 file_index = 0 41while True: 42if file_index >= len(self.file_bin): 43break44 self.rec_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 45 self.rec_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) 46 self.rec_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 47 self.rec_sock.bind((‘‘, self.client_port)) 48print(‘=== Waiting for packet‘) 49 msg, addr = self.rec_sock.recvfrom(1024) 50 msgBody = ServerCodeC.collect(msg) 51print(‘<<< RECV from %s, client ip is %s, xid: %s, mac id: %s‘ % 52 (addr, msgBody[‘ciaddr‘], msgBody[‘xid‘], msgBody[‘chaddr‘])) 53if self.requestCheck(msgBody): 54print(‘=== This is a valid message‘) 55 offer = ServerCodeC.offer(transaction_id=msgBody[‘xid‘], 56 client_ip_offer=self.offer_ip, 57 server_ip=self.server_ip, 58 client_mac_id=msgBody[‘chaddr‘], 59 file_path=self.file_bin[file_index]) 60 self.send_sock.sendto(offer, (‘<broadcast>‘, 68)) 61print(‘>>> SEND ("<broadcast>", 68), offer ip "%s", file name is "%s"‘ % 62 (self.offer_ip, self.file_bin[file_index])) 63 file_index += 1 64print(‘=== BOOTP server exit‘) 6566 server = BOOTPServer() 67 server.server_start()
客户端建立步骤主要有:
(1) 客户端ip未知,服务端口68,客户端口67;
(2) 建立主循环,建立socket/UDP,广播模式允许复用,监听服务端端口;
(3) 广播模式朝客户端口67发送请求报文,请求报文中填入客户端信息,如xid,mac_id等,并等待接收回复报文;
(4) 进行接收等待,若未超时且受到有效报文,则对有效报文进行解码;
(5) 解码报文获取相应信息,确认xid,mac_id与发送时的是否匹配;
(6) 提取报文信息,为后续(TFTP下载启动文件)做准备;
1 import socket 2 import binascii 3 import struct 4 from BOOTP_CodeC import ClientCodeC 5 6class BOOTPClient(): 7def__init__(self): 8 self.client_ip = ‘0.0.0.0‘ 9 self.broadcast_ip = ‘255.255.255.255‘# or ‘<broadcast>‘10 self.server_ip = ‘127.0.0.1‘11 self.target_port = 67 12 self.source_port = 68 13 ClientCodeC.get_xid_macid() 1415def recv_check(self, m): 16ifnot ( 17 m[‘op‘] == b‘\x02‘and# OP18 m[‘htype‘] == b‘\x01‘and# HTYPE19 m[‘hlen‘] == b‘\x06‘and# HLEN20 m[‘hops‘] == b‘\x00‘and# HOPS21 m[‘secs‘] == [b‘\x00‘, b‘\x00‘] and# SECS22 m[‘flags‘] == [b‘\x80‘, b‘\x00‘] and# FLAGS (broadcast)23 m[‘xid‘] == ClientCodeC.transaction_id and24 m[‘chaddr‘] == ClientCodeC.client_mac_id and25 len(m[‘file‘]) 26 ): 27return False 28return True 2930def client_request(self): 3132while True: 33 self.client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 34 self.client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) 35 self.client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 36 self.client_sock.settimeout(5) 37#self.client_sock.bind((self.server_ip, 68))38 self.client_sock.bind((‘‘, 68)) 3940 self.client_sock.sendto(ClientCodeC.request(), (‘<broadcast>‘, self.target_port)) 41print(‘>>> SEND ("<broadcast>", %d) request command‘ % self.target_port) 42try: 43 data, addr = self.client_sock.recvfrom(1024) 44except socket.timeout: 45print(‘=== BOOTP client exit‘) 46break47 msgBody = ClientCodeC.collect(data) 48print(‘<<< RECV‘, addr) 49if self.recv_check(msgBody): 50print(‘=== This is a valid message‘) 51 client_ip = msgBody[‘yiaddr‘] 52 server_name = msgBody[‘sname‘] 53 file_name = msgBody[‘file‘] 54 server_ip = msgBody[‘siaddr‘] 55print(‘=== Server ip: %s, server name: %s, file name: %s, get ip address: %s‘ % 56 (server_name, server_ip, file_name, client_ip)) 57 client = BOOTPClient() 58 client.client_request()
相关阅读
1. BOOTP 基本理论
协议 -> BOOTP 的 Python 实现' ref='nofollow'>Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现
原文:https://www.cnblogs.com/stacklike/p/8149737.html
内容总结
以上是互联网集市为您收集整理的Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现全部内容,希望文章能够帮你解决Python的网络编程[3] -> BOOTP 协议 -> BOOTP 的 Python 实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。