任务描述
本关任务:完成一个客户端程序,向服务器端发出请求,传输数据,并设置超时丢包,服务器会进行相应的反馈,我们需要计算来自服务器的数据包丢失率。
相关知识
为了完成本关任务,你需要回顾上一关卡的具体内容,包括:
- 创建
socket
对象; - 发送 UDP 数据;
- 接收 UDP 数据;
- 设置超时。
如果已经忘记了相关的内容,请返回第一关进行复习,打好基础。如果你已经掌握了第一关的知识,那么这关将会变得轻松。
除此之外,你需要知道如何计算丢包率。
丢包率的计算
所谓网络中的丢包率是数据包丢失数量与所传数据包总数的比值,即:
丢包率 = [(输入报文数量-输出报文数量) / 输入报文数量] * 100%
编程要求
本实训使用python3
进行编程,客户端将采用 UDP 方式连接服务器,你需要在右侧编辑器补充代码,完成客户器的功能,具体操作如下:
-
由于评测系统的服务器端文件和客户端文件位于同一台主机,我们可以使用
localhost
表示服务器端地址。 -
端口号为
56789
。 -
设置超时时长为
1
秒。 -
客户端发送的内容为
Ping x time
,x
表示第几次发送。(你不需要将发送内容输出) -
接收的内容为
Receive x: from y
,你需要将其输出,其中x
表示收到第几次的报文,y
为来自服务器的消息(并且是解码后的字符串类型的消息),具体参考预期输出。 -
发生丢包时要有反馈信息,并且需要输出,内容为
The x package is lost
,x
为第几次发生数据包报丢失,x
初始值为0
,表示没有出现任何丢包情况,每出现一次丢失数据包,x
值就会增加一,具体参考预期输出。 -
最后你需要计算丢包率并将其输出,输出格式为
Packet loss rate: x
,其中x
为浮点数,表示丢包率,我们需要保留其小数点后两位。
测试说明
平台会对你编写的代码进行测试:
预期输出: The 1 package is lost
Receive 2: Hello, I am here
Receive 3: Hello, I am here
The 4 package is lost
Receive 5: Hello, I am here
Receive 6: Hello, I am here
Receive 7: Hello, I am here
Receive 8: Hello, I am here
The 9 package is lost
Receive 10: Hello, I am here
Packet loss rate: 0.30
开始你的任务吧,祝你成功!
AC代码
from socket import *
#********* Begin *********#
# 指定服务器地址和端口
addressPort = ("localhost", 56789)
#********* End *********#
#********* Begin *********#
# 创建UDP套接字
s = socket(AF_INET, SOCK_DGRAM)
# s.bind(('', 56789))
#********* End *********#
#********* Begin *********#
# 设置套接字超时值1秒
s.settimeout(1)
#********* End *********#
i = 1
count = 0 # 可以用来记录丢包的个数
while i <=10:
try:
# ********* Begin *********#
# 生成数据报,编码为bytes,并发送给服务器
data = bytes("Ping " + str(i) + " time", encoding='utf-8')
s.sendto(data, addressPort)
# ********* End *********#
# ********* Begin *********#
# 从服务器接收信息,同时也能得到来自服务器的数据,需要输出该数据,具体见编程要求
received_data, address = s.recvfrom(1024)
print("Receive " + str(i) + ": " + received_data.decode())
# ********* End *********#
except Exception as e:
# ********* Begin *********#
# 输出超时丢包的反馈信息。记录丢包的个数,便于后面计算丢包率
count += 1
print("The " + str(i) + " package is lost")
# ********* End *********#
i = i + 1
# ********* Begin *********#
# 计算并输出丢包率
packet_loss_rate = (count / 10)
print("Packet loss rate: {:.2f}".format(packet_loss_rate))
# ********* End *********#
#********* Begin *********#
# 关闭该UDP套接字
s.close()
#********* End *********#