计网课后编程作业
UDP ping程序
在这个编程作业中,你将用Python编写一个客户ping程序。该客户将发送一个简单的ping报文,接收一个从服务器返回的对应pong报文,并确定从该客户发送ping报文到接收到pong报文为止的时延。该时延称为往返时延(RTT)。由该客户和服务器提供的功能类似于在现代操作系统中可用的标准ping程序。然而,标准的ping使用互联网控制报文协议(ICMP)。此时我们将创建一个非标准(但简单)的基于UDP的ping程序。
你的ping程序经UDP向目标服务器发送10个ping报文。对于每个报文,当对应的pong报文返回时,你的客户要确定和打印RTT。因为UDP是一个不可靠的协议,由客户发送的分组可能丢失。为此,客户不能无限期地等待对ping报文的回答。客户等待服务器回答的时间至多为1秒;如果没有收到回答,客户假定该分组丢失并相应地打印一条报文。
在此作业中,你将给出服务器的完整代码(在配套网站中可找到)。你的任务是编写客户代码,该代码与服务器代码非常类似。建议你先仔细学习服务器的代码,然后编写你的客户代码,可以随意地从服务器代码中剪贴代码行。
备注
毫无疑问,这是我当时提交过的作业,同样能够正常运行,绝对莫问忒~😜
如果没有问题就麻烦给个赞哦~
下面赶紧奉上:
源码
Server端
import random
from socket import *
HOST = ''
PORT = 12001
BUFSIZE = 1024
ADDR = (HOST, PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print('wating for connection...')
data, addr = udpSerSock.recvfrom(BUFSIZE)
rand = random.randint(0, 10)
print(rand, addr)
data = data.upper()
if rand < 4: #人工模拟丢包
continue
udpSerSock.sendto(data, addr)
udpSerSock.close()
Client端
from socket import *
from time import *
from datetime import *
HOST = '127.0.0.1'
PORT = 12001
BUFSIZE = 1024
ADDR = (HOST, PORT)
TIMEOUT = 1
udpCliSock = socket(AF_INET, SOCK_DGRAM)
udpCliSock.settimeout(TIMEOUT)
for i in range(0, 10):
data = input('> ')
if not data:
break
try:
begin_time = datetime.now()
udpCliSock.sendto(data.encode(), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZE)
end_time = datetime.now()
if data:
print('Response: ', data)
time = (end_time - begin_time).microseconds # 微秒
print('RTT: ', time, 'ms')
except Exception as e:
print(e)
udpCliSock.close()