第1关:UDP 初体验
from socket import *#********* Begin *********## 指定服务器地址和端口address=('127.0.0.1',56789);#********* End *********##********* Begin *********## 创建UDP套接字s=socket(AF_INET,SOCK_DGRAM);#********* End *********##********* Begin *********## 设置套接字超时值1秒s.settimeout(1);#********* End *********#bufsize=1024;i = 0while i < 2: try: # ********* Begin *********# # 生成数据报,编码为bytes以便发送 message=bytes('Ping {} time'.format(i+1),encoding='utf-8'); # ********* End *********# # ********* Begin *********# # 将信息发送到服务器 s.sendto(message,address); # ********* End *********# # ********* Begin *********# # 从服务器接收信息,同时也能得到服务器地址,并将其输出 data,address=s.recvfrom(bufsize); data=bytes.decode(data); print("Receive {}: from {}".format(i+1,address)); # ********* End *********# except Exception as e: # ********* Begin *********# # 输出超时丢包的反馈信息 print("Sequence {}: Request timed out".format(i+1)); # ********* End *********# i = i + 1#********* Begin *********## 关闭该UDP套接字s.close();#********* End *********#
第2关:UDP 计算丢包率
from socket import *#********* Begin *********## 指定服务器地址和端口address=('127.0.0.1',56789);#********* End *********##********* Begin *********## 创建UDP套接字s=socket(AF_INET,SOCK_DGRAM);#********* End *********##********* Begin *********## 设置套接字超时值1秒s.settimeout(1);#********* End *********#bufsize=1024;i = 0count = 0 # 可以用来记录丢包的个数while i < 10: try: # ********* Begin *********# # 生成数据报,编码为bytes,并发送给服务器 message=bytes('Ping {} time'.format(i+1),encoding='utf-8'); s.sendto(message,address); # ********* End *********# # ********* Begin *********# # 从服务器接收信息,同时也能得到来自服务器的数据,需要输出该数据,具体见编程要求 data,address=s.recvfrom(bufsize); data=bytes.decode(data); print("Receive {}: {}".format(i+1,data)); # ********* End *********# except Exception as e: # ********* Begin *********# count=count+1; # 输出超时丢包的反馈信息。记录丢包的个数,便于后面计算丢包率 print("The {} package is lost".format(i+1)); # ********* End *********# i = i + 1# ********* Begin *********## 计算并输出丢包率print('Packet loss rate: {:.2f}'.format(count/i));# ********* End *********##********* Begin *********## 关闭该UDP套接字s.close();#********* End *********#
第3关:创建基于 UDP 的 Ping 程序
from socket import *import time#********* Begin *********## 指定服务器地址和端口address=('127.0.0.1',56789)#********* End *********##********* Begin *********## 创建UDP套接字s=socket(AF_INET,SOCK_DGRAM);#********* End *********##********* Begin *********## 设置套接字超时值1秒s.settimeout(1);#********* End *********#bufsize=1024;i = 0while i < 10: sendTime = time.time() # 记录发送ping报文的当前时间戳 try: # ********* Begin *********# # 生成数据报,编码为bytes,并发送给服务器 message=bytes('Ping {} time'.format(i+1),encoding='utf-8'); s.sendto(message,address); # ********* End *********# # ********* Begin *********# # 从服务器接收信息,同时也能得到来自服务器的地址,需要输出该地址,(不要输出端口号!) # 并且需要计算和输出RTT,具体见编程要求 data,address=s.recvfrom(bufsize); receiveTime=time.time(); data=bytes.decode(data); print("Receive {}: Reply from {} RTT = {:.2f}s".format(i+1,address[0],receiveTime-sendTime)); # ********* End *********# except Exception as e: # ********* Begin *********# # 输出超时丢包的反馈信息。 print("Sequence {}: Request timed out".format(i+1)); # ********* End *********# i = i + 1#********* Begin *********## 关闭该UDP套接字s.close();#********* End *********#