c语言sscanf函数的用法是什么
278
2022-11-18
网络编程(part10)--socket套接字编程之UDP套接字
鄙人学习笔记
文章目录
UDP套接字编程
服务端流程
举个例子
客户端流程
举个例子
TCP套接字和UDP套接字编程区别
UDP套接字编程
服务端流程
创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
绑定地址
sockfd.bind(addr)
备注:作为服务端,必然要绑定地址的。
消息收发
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息参数: 每次最多接收多少字节返回值: data 接收到的内容 addr 消息发送方地址
n = sockfd.sendto(data,addr)
功能: 发送UDP消息参数: data 发送的内容 bytes格式 addr 目标地址返回值:发送的字节数备注:由于UDP没有创建连接,所以没有一个专门的连接套接字对象(一发送就知道发送给谁),所以我们需要指明目标地址。
备注:UDP不需要创建连接。
关闭套接字
sockfd.close()
举个例子
代码:
from socket import *#创建数据报套接字sockfd = socket(AF_INET, SOCK_DGRAM)#绑定地址server_addr = ('127.0.0.1',8888)sockfd.bind(server_addr)#收发消息while True: data,addr = sockfd.recvfrom(1024) print("收到的消息:",data.decode()) sockfd.sendto(b"Thanks",addr)#关闭套接字sockfd.close()
客户端流程
创建数据报套接字收发消息关闭套接字
备注:依然要注意,客户端与服务端的收发顺序。若服务端先收后发,则客户端先发后收。
举个例子
运行客户端,并发送消息:
备注:由于是UDP协议,所以相当”自由”,可以同时接收多个客户端发来的消息。在这里就不演示了。
这里,我们再更改一下服务端的recvfrom的参数,来控制一下每次最多能接收的字节数(客户端代码不变)。
服务端代码:
得到5个字节。
咦?这是咋回事?咋和TCP的不太一样? …好吧,第一次发送的【hello world】的后面的【 world】丢失了。这是提供不可靠传输服务的体现。但这个是合理的,比如,客户端A和客户端B都向服务端send()消息,UDP协议的不可靠传输虽然可能会丢失消息,但不会使客户端A发送过来的消息,显示在客户端B发送的消息里面。这样,宁愿丢失消息,也不能导致混乱。 所以,UDP套接字传输中,如果一次接收消息接收不完(超过最多能接收的字节数),则会把剩下的消息(超过指定字节数的部分)丢弃。
同时,UDP数据传输是不存在粘包的问题,因为它存在消息边界。就像我们之前形容的那样,TCP传输是水流,UDP传输是水瓶。UDP传输,是一个一个”数据报”传输的,它的消息之间是存在边界的。
TCP套接字和UDP套接字编程区别
①流式套接字是以字节流方式传输数据;数据报套接字以数据报形式传输 ②TCP套接字会有粘包;UDP套接字有消息边界,不会粘包 ③TCP套接字保证消息的完整性;UDP套接字则不能 ④TCP套接字依赖listen、accept建立连接才能收发消息;UDP套接字则不需要 ⑤TCP套接字使用send、recv收发消息;UDP套接字使用sendto、recvfrom
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~