首页 > 其他分享 >UDP

UDP

时间:2023-08-12 22:34:49浏览次数:40  
标签:UDP socket udp broadcast address 接字

UDP不像TCP创建连接时有3次握手,而是直接发送数据,不管对方是否接收到。

UDP网络通信不区分客户端和服务端。

 

UDP收发数据的步骤

  1.创建UDP套接字对象
  2.直接发送数据
  3.读取数据
  4.关闭套接字

 

示例

服务端

 1 '''
 2 UDP应该说没有服务端和客户端,只是习惯称发请求的为客户端端,对方为服务端
 3 
 4 最佳实践:
 5     1. 创建UDP套接字:使用socket.socket()函数创建一个UDP套接字对象。
 6         import socket
 7         # 创建UDP套接字
 8         udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 9     2. 绑定地址和端口:使用bind()方法将套接字绑定到指定的IP地址和端口。
10         # 绑定地址和端口
11         udp_socket.bind(('127.0.0.1', 8000))
12     3. 发送数据:使用sendto()方法发送数据给指定的目标地址和端口。
13         # 发送数据
14         data = b"Hello, UDP server!"
15         udp_socket.sendto(data, ('127.0.0.1', 9000))
16     4. 接收数据:使用recvfrom()方法接收来自其他主机的数据,并返回接收到的数据和发送方的地址信息。
17         # 接收数据
18         data, addr = udp_socket.recvfrom(1024)
19         print("Received data:", data.decode())
20         print("From address:", addr)
21     5. 关闭套接字:使用close()方法关闭套接字。
22         # 关闭套接字
23         udp_socket.close()
24 '''
25 import socket
26 
27 # 创建UDP套接字
28 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
29 udp_socket.bind(('127.0.0.1', 8000))
30 
31 while True:
32     # 接收数据
33     data, addr = udp_socket.recvfrom(1024)
34     print("Received data:", data.decode())
35 
36     # 发送数据
37     message = input("Enter message to send: ")
38     udp_socket.sendto(message.encode(), addr)

客户端

import socket

# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:
    # 发送数据
    message = input("Enter message to send: ")
    udp_socket.sendto(message.encode(), ('127.0.0.1', 8000))

    # 接收数据
    data, addr = udp_socket.recvfrom(1024)
    print("Received data:", data.decode())

这个案例展示了一个简单的UDP聊天应用程序,服务器和客户端可以互相发送消息。服务器接收到客户端发送的消息后,将其显示在控制台,并向客户端回复一个消息。

 广播

 1 import socket
 2 
 3 # 创建UDP套接字
 4 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 5 udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 6 
 7 # 广播地址和端口号
 8 broadcast_address = '<broadcast>'
 9 port = 8000
10 
11 # 发送消息到广播地址
12 message = "Hello, broadcast!"
13 udp_socket.sendto(message.encode(), (broadcast_address, port))  # 
14 
15 # 接收来自服务器的响应
16 response, address = udp_socket.recvfrom(1024)
17 print("Received response from server:", response.decode())
18 print("Server address:", address)
19 
20 # 关闭套接字
21 udp_socket.close()
# 服务端代码,用于处理广播消息
import socket

# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 绑定到特定的IP地址和端口号
server_address = ('', 8000)
udp_socket.bind(server_address)

while True:
    # 接收来自客户端的请求
    data, address = udp_socket.recvfrom(1024)
    print("Received request from client:", data.decode())
    print("Client address:", address)

    # 发送回复消息
    response = "Hello, client!"
    udp_socket.sendto(response.encode(), address)


# 客户端代码,用于发送广播消息
import socket

# 创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

# 广播地址(是广播地址的,也可以这样写)和端口号(端口号是服务端的端口)
broadcast_address = '<broadcast>'
port = 8000

# 发送广播消息
message = "Service discovery request"
udp_socket.sendto(message.encode(), (broadcast_address, port))

# 接收来自服务端的回复消息
response, address = udp_socket.recvfrom(1024)
print("Received response from server:", response.decode())
print("Server address:", address)

# 关闭套接字
udp_socket.close()

获取广播地址的代码:

import socket
import struct


def calculate_broadcast_address(ip_address, subnet_mask):
    ip_bytes = socket.inet_aton(ip_address)
    mask_bytes = socket.inet_aton(subnet_mask)

    # 将IP地址和子网掩码转换为32位整数
    ip_int = struct.unpack('!I', ip_bytes)[0]
    mask_int = struct.unpack('!I', mask_bytes)[0]

    # 计算广播地址
    broadcast_int = ip_int | (~mask_int & 0xFFFFFFFF)

    # 将广播地址转换为字符串形式
    broadcast_address = socket.inet_ntoa(struct.pack('!I', broadcast_int))

    return broadcast_address


ip_address = '192.168.68.1'  # 自己电脑的ip
subnet_mask = '255.255.255.0'  # ip对于的子网掩码
broadcast_address = calculate_broadcast_address(ip_address, subnet_mask)
print("Broadcast Address:", broadcast_address)

客户端:

 服务端:

 参考:https://www.bilibili.com/video/BV1dZ4y1o7Az/?spm_id_from=333.337.search-card.all.click&vd_source=551c4b0e8145ff81bc32a29ff09a3238

 

标签:UDP,socket,udp,broadcast,address,接字
From: https://www.cnblogs.com/allenxx/p/17625686.html

相关文章

  • 测试udp端口联通性
    时钟服务器默认使用的UDP协议的123端口,测试联通性时不能使用telnet命令,可以使用nc命令,如下:nc-vuz192.168.1.2123Connectionto192.168.1.2123port[udp/ntp]succeeded!如果没有安装,可以使用yum进行安装yuminstall-ync......
  • libhv创建简单udp控制台测试程序
    client:#include<iostream>#include"hv/UdpClient.h"#pragmacomment(lib,"hv.lib")classclient{public: client() { cli=nullptr; } ~client() { SAFE_DELETE(cli); } intsend(conststd::string&msg) { returnc......
  • TCP三次握手和四次挥手;OSI七层协议有哪七层,每层有哪些;TCP和UDP的区别?UDP用在哪里了?
    TCP三次握手和四次挥手;OSI七层协议有哪七层,每层有哪些;TCP和UDP的区别?UDP用在哪里了?TCP三次握手和四次挥手#tcp协议---》处于osi7层协议的传输层,可靠连接,使用三次握手,四次挥手保证了可靠连接,数据不会丢失三次握手(Three-WayHandshake):-SYN:SYN=1表示要建立连接-ACK:ACK=1......
  • LinuxUDP通讯
    目录前言一、UDP通讯1.UDP通讯概述2.UDP的特点3.UDP的应用二、UDP基本通讯1.socket函数2.bind函数2.1主机字节序和网络字节序2.2点分制十进制转换3.recvfrom接收4.服务端完整代码5.sendto发送函数6.客户端完整代码三、TFTP文件接收程序1.TFTP概述2.TFTP通讯过程3.TFTP客户端四、......
  • udp发送上位机(1)
    发送彩色视频RGB888时,在上位机,通过BGR2BGR565转换为16位数据,再传输时加上行号,在DMA里也要对读出的数据进行高低位的变换,组成RGB565格式如下图所示,在灰度图时将每帧刷新改为了每一行刷新,这是因为在彩色图像时,刷新一帧的时间大于2ms,而灰度时为0.7ms,这就会导致在刷新的时候,新的数据......
  • UDP 编程
    UDP编程#include<sys/socket.h>//可以发送或接收一个长度为0的数据报ssize_trecvfrom(intsockfd,void*buf,size_tnbytes,intflags,//常与recvsendrecvmsgsendmsg配合structsockaddr*from,sockl......
  • nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,
    nps  nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。背景做微......
  • 使用UDP和RDP共享电脑屏幕和声音
    publicpartialclassForm1:Form{privateWasapiLoopbackCapturemic;//音频输入protectedRDPSession_rdpSession=null;publicForm1(){InitializeComponent();}staticThreadreceiveThrea......
  • udp接收上位机编程(2)彩色图像
    由于QT上位机只能接收BGR565的图像格式,且只能显示灰度或者RGB888,所以PL2PS的数据必须要变换位置,并使用cvtColor函数进行转换1voidMainWindow::recieve_dis(intudp_index)2{3Matrecv_img_2(img_h_size,img_w_size,CV_8UC2);4Matrecv_img_3(img_h_size,img_......
  • 009 python socket UDP服务端程序,在pycharm正常运行,生成的exe运行有时候接收不到数据,
    写了一个简单的socket服务端程序,在pycharm中正常,生成exe后运行,有时候接收不到数据。经过半天折腾,发现,只要按一下回车,程序又能正常运行了。最终发现,是因为控制台的快速编辑功能打开导致程序假死。在控制台程序的菜单栏右键点击--->默认值--->去掉“快速编辑模式”和“插入模式”......