创作不易,请留个赞吧!!!
任务描述
本关任务:在 Ping 的服务程序中创建一个使用 UDP 协议的套接字。
相关知识
为了完成本关任务,你需要掌握:
- 数据包套接字类型;
- 为套接字绑定 IP 地址及端口。
数据包套接字
套接字有三种类型:流式套接字(SOCK_STREAM
),数据包套接字(SOCK_DGRAM
)及原始套接字(SOCK_RAW
)。 数据包格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM
表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征: 强调快速传输而非传输顺序; 传输的数据可能丢失也可能损毁; 限制每次传输的数据大小; 数据的发送和接收是同步的。 数据包套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。
实际应用中,QQ 视频聊天和语音聊天主要使用 SOCK_DGRAM
来传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响。当然,SOCK_DGRAM
没有想象中的糟糕,不会频繁的丢失数据,数据错误只是小概率事件。
创建数据包套接字并绑定主机端口
套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前,双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。 一个完整的 Socket 则用一个通信双方的相关描述: {协议,本地地址,本地端口,远程地址,远程端口} 实际应用中,在创建一个 Socket 时先用一个半相关描述(因为另一半尚不确定): {协议,本地地址,本地端口} 每一个 Socket 有一个本地的唯一端口号,由操作系统分配。
在 Python 中,创建套接字的函数为: socket(socket_family,socket_type,protocal=0)
其中:socket_family 一般为AF_INET
;socket_type 可以是 SOCK_STREAM
或 SOCK_DGRAM
。protocol 一般不填,默认值为 0。 如创建 TCP 套接字: tcpSock = socket(AF_INET, SOCK_STREAM)
创建 UDP 套接字: udpSock = socket(AF_INET, SOCK_DGRAM)
为套接字绑定主机
绑定指为套接字绑定地址包含主机及其端口。 在AF_INET
下,以元组(host,port)
的形式表示地址。 host
:用字符串表示的IP地址。表示本机,也可用回环地址127.0.0.1
。 port
:端口号,数字表示。1024 以下为系统约定,自定义的用 1024 以上。
编程要求
根据提示,在右侧编辑器代码的Begin
与End
之间补充代码,创建一个数据包套接字,并绑定本机地址,端口号为 12000。
测试说明
平台会对你编写的代码进行测试,并输出创建的套接字属性。
预期输出:文章来源:https://www.toymoban.com/news/detail-835016.html
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('0.0.0.0', 12000)>
程序源代码文章来源地址https://www.toymoban.com/news/detail-835016.html
# UDPPingerServer.py
from socket import *
########## Begin ##########
# 创建UDP套接字
serverSocket = socket(AF_INET, SOCK_DGRAM)
# 绑定本机IP地址和端口号
serverSocket.bind(('', 12000))
########## End ##########
# 输出socket信息
print( serverSocket)
到了这里,关于UDP Ping程序实现--第1关:Ping服务端创建UDP套接字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!