第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 = 0
while 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 = 0
count = 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 = 0
while 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 *********#