数据的发送是面向整个子网的,任何一台在子网内的计算机都可以接收到相同的数据;
广播地址
广播地址是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机号为全1的IP地址为广播地址。例如,对于 :192.168.199.0(掩码:255.255.255.0)网段,其广播地址为192.168.199.255 (255 即为2进制的11111111 ),当发出一个目的地址为192.168.199.255的分组时,它将被分发给该网段上的所有计算机。
直接广播地址:指Host部分全为1的广播地址。如:192.168.199.255。当某机器发出目的地址为直接广播(如:192.168.199.255)时,路由器通过查找路由表可以转发,直到该网段。
受限广播地址:也称本地广播地址,它不被路由发送,但会被送到相同物理网络段上的所有主机,IP地址的网络号和主机号 全为1就是地址255.255.255.255,当某机器发出目的地址为本地广播时,路由器不会转发该包。所以该包只能限制在本网段
下例功能:通过192.168.1.255:60101广播数据,告诉其他节点可以通过60102跟本机通信
# coding:utf8
import sys,threading,time
from datetime import datetime
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
class Echo(DatagramProtocol):
'''
ConnectedUDP
'''
def __init__(self,host:str,port:int):
'''
构造函数
:param host: 目标地址
:param port: 目标端口
'''
self.host = host
self.port = port
def startProtocol(self):
self.transport.connect(self.host,self.port)
print('Connection Create !')
def connectionRefused(self):
print('sent failed !')
pass
def stopProtocol(self):
print('Connection close !')
pass
def datagramReceived(self, datagram: bytes, addr):
print('Got data from :%s' % (addr,))
print(datagram.decode('utf8'))
host = '192.168.1.255' # 广播地址(交换机、路由器都适用)
# host = '255.255.255.255' #只适用于交换机连接
port = 60101
loacl_port= 60102
protocol = Echo(host,port)
b_stop = False
def routine():
while not b_stop:
time.sleep(5)
str_msg = 'hello , i am %s %s,my port is: %d' % (sys.argv[0], datetime.now(),loacl_port)
protocol.transport.write(str_msg.encode('utf8'))
threading.Thread(target=routine).start()
reactor.listenUDP(loacl_port,protocol)
reactor.run()
b_stop=True