python socket向客户端广播问题

Python015

python socket向客户端广播问题,第1张

import socket,traceback

host = '2.2.3.5'

port = 85

txt = input("请输入广播内容:")

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

s.bind((host,port))

print "Listen on the port 85......"

while True:

try:

sock,addr = s.recvfrom(8192)

print "Receive data from:",addr

s.sendto(txt,addr)#这里就是填写发送内容的

except (KeyboardInterrupt,SystemExit):

raise

except:

traceback.print_exc()

#未对以上代码的正确性进行验证。

  DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息。

option字段

  DHCP报文中的Options字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP服务器端配置了Options字段,DHCP客户端在申请IP地址的时候,会通过服务器端回应的DHCP报文获得Options字段中的配置信息。

获取IP地址过程

  实验使用的linux 主机由两个网络接口,其中ens33使用DHCP获取IP地址,ens37使用静态IP地址;因此需要使用ens33来发送数据包。

  Change_MAC.py用于MAC地址与Bytes类型相互转换。

  DHCP_Discover.py用于发送DHCP Discover报文其中GET_MAC.py见ARP章节。

  DHCP_Request.py用于发送DHCP Request报文。

  DHCP_FULL.py用于完成DHCP Client与DHCP Server的报文交互

Wireshark对远程linux主机抓包,结果如下

客户端以广播发送DHCP Discover包,其中报文操作类型为1(请求报文),DHCP客户端的MAC地址设置为00:0c:29:03:a1:08,option53设置报文类型为Discover,option55(请求选项列表)中包含请求的参数。

服务器以单播向客户端回复信息,其中报文操作类型为2(应答报文),分配给客户端的IP为192.168.160.146,option 53设置报文类型为offer,Option 54设置服务器标识为192.168.160.254,其他option为客户端请求列表的应答。

值得注意的是,交互的四个报文中Transaction ID均为0x00000000,表明是同一次DHCP交互报文。