UDP广播接收和发送详解(不为人知的UDP)

一、UDP简介

UDP(User Datagram Protocol)是一种面向无连接的传输层协议,和TCP(Transmission Control Protocol)不同,UDP不提供可靠性、流量控制和拥塞控制机制。UDP只是把应用程序传给它的数据报发送出去,但是并不能保证它们能够到达目的地,也不能保证它们被接收方按照发送的顺序接收。

UDP协议广泛应用于互联网的视频、语音、游戏和实时数据传输等场景,因为UDP协议无需建立连接,可以在网络拥塞时快速传输数据,并且对于一些数据传输时效性要求高的场景,UDP的丢包机制也能够减少等待时间,提高用户体验。

二、UDP广播发送

广播发送是UDP协议的一种高效的数据传输方式,它可以在同一子网内的所有主机上同时发送数据,这样可以节省网络通信带宽和传输时间。

1. 创建UDP Socket并设置广播选项

import socket

server_address = ('', 10000)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(server_address)

前三行代码创建了一个UDP Socket实例,并指定IP地址为本地地址、端口号为10000,第四行代码设置了广播选项,表示发送广播数据。

2. 广播发送数据

message = b'Hello, world!'
sock.sendto(message, ('255.255.255.255', 10000))

第一行代码定义了要发送的数据,第二行代码使用sendto()函数发送广播数据到所有主机的255.255.255.255地址,并且端口号也设置为10000。

三、UDP广播接收

广播接收是UDP协议的一种接收数据的方式,可以监听在特定的IP地址和端口上,接收来自广播发送者的所有数据。

1. 创建UDP Socket并绑定地址和端口

import socket

server_address = ('', 10000)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(server_address)

前三行代码创建了一个UDP Socket实例,并指定IP地址为本地地址、端口号为10000,第四行代码设置SO_REUSEADDR选项,表示在端口号被占用时可以重新使用。

2. 接收广播数据

while True:
    data, address = sock.recvfrom(4096)
    print(f'Received {len(data)} bytes from {address}: {data}')

第一行代码进入循环,不断接收数据和返回客户端的连接信息。第二行代码使用recvfrom()函数接收从客户端发送过来的数据和地址信息,最后打印出接收的数据和发送方的IP地址。

四、UDP多播发送

多播是一种可以向一组主机同时发送数据的网络通信方式,它可以节省网络通信带宽和传输时间,并且对于一些数据传输时效性要求高的场景也非常有用。

1. 创建UDP Socket并设置多播选项

import socket

multicast_group = ('224.3.29.71', 10000)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)

前三行代码创建了一个UDP Socket实例,第一行代码指定了多播组的IP地址和端口号,第四行代码设置了多播选项,表示发送多播数据。

2. 多播发送数据

message = b'Hello, world!'
sent = sock.sendto(message, multicast_group)

第一行代码定义了要发送的数据,第二行使用sendto()函数发送多播数据,通过multicast_group指定了多播组的IP和端口号。

五、UDP多播接收

多播接收是UDP协议的一种接收数据的方式,可以监听在特定的IP地址和端口上,接收来自多播发送者的所有数据。

1. 创建UDP Socket并绑定地址和端口

import socket

multicast_group = '224.3.29.71'
server_address = ('', 10000)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

前五行代码创建了一个UDP Socket实例,指定了本地地址和端口号,第六行代码把多播组的IP地址转换成二进制格式,第七行代码打包了多播组的地址和接收端口号并设置IP_ADD_MEMBERSHIP选项,表示加入该多播组。

2. 接收多播数据

while True:
    data, address = sock.recvfrom(4096)
    print(f'Received {len(data)} bytes from {address}: {data}')

第一行代码进入循环,不断接收数据和返回客户端的连接信息。第二行代码使用recvfrom()函数接收从客户端发送过来的数据和地址信息,最后打印出接收的数据和发送方的IP地址。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平