作业2-2 UDP ping程序-计算机网络自顶向下方法
《计算机网络自顶向下方法》一书中P119的作业,也是我们的计算机网络基础课程的作业,比较简单,仅供xio弟xio妹们参考,不要抄不要抄不要抄,重要的事说三遍,至少也要自己打一遍哦
这也是我,敲过代码的证据hhh
任务1 学习 ping 服务器 代码
这个代码是老师发下来的,网上也可以找的,书上说了的
这里是老师发的文件,==老师用心负责,注释都写得很清楚
然后应该根据这个server端的代码,自己完成client端的代码
server端代码:
# UDPPingerServer.py
# We will need the following module to generate randomized lost packets import random
from socket import *
import random
# Create a UDP socket
# Notice the use of SOCK_DGRAM for UDP packets
serverSocket = socket(AF_INET, SOCK_DGRAM)
# Assign IP address and port number to socket
serverSocket.bind(('', 12000))
while True:
# Generate random number in the range of 0 to 10
rand = random.randint(0, 10)#随机整数模拟丢包
# Receive the client packet along with the address it is coming from
message, address = serverSocket.recvfrom(1024)
# Capitalize the message from the client
message = message.upper()
# If rand is less is than 4, we consider the packet lost and do not respond
if rand < 4:
continue
# Otherwise, the server responds
serverSocket.sendto(message, address)
任务2 编写 ping 客户端 代码
根据server端代码,编写ping client端代码报文
接收服务器返回对应的响应报文,并确定往返时延( RTT )
客户端 程序的命令格式(即输入格式):
client.py server_address server_port
client.py :客户端文件名
server_address:server端地址
server_port:sever端的端口号
客户端发送的报文内容:
Ping sequence_ number send_time
sequence_number:报文编号
sendtime:发送的时间,要求以“年月日时分秒“的形式发送
客户端收到服务器返回的响应报文显示的信息:
1.时间超过1s,超时,显示
Request time out
2.收到回复,显示:
Reply from server_address ping _message RTT= rtt_value ms
server_address:服务器端地址
ping_message:从服务器端发过来的报文内容
RTT= rtt_value ms:从发送到接收的时间间隔,单位为ms
附上代码(原创,禁止转载):
#UDPPingClient.py
from socket import*
import time
#serverName='127.0.0.1' 再后面将由用户输入
#serverPort=12000
k=0 #用于计算timeout的数量,以便计算PacketLostRate
MaxRTT=0 #RTT比0大则替换
MinRTT=1000 #RTT比1000小就替换
Sum=0 #计算RTT总和以求平均RTT
#create a UDP socket
clientSocket=socket(AF_INET,SOCK_DGRAM)
#获取serverName&serverPort
information=input('Please input: client.py server_addresss server_port\n')
#将用户输入按空格符分成列表
information=information.split(' ')
#1存储的是用户输入的server地址
serverName=information[1]
#2存储的是端口,接收的str类型,要转换成int
serverPort=int(information[2])
for i in range(0,10):
try:
time_str = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
# *1000,将单位s变为ms
start_time=time.time()*1000
#内容为Ping+编号+发送的时间
context=('Ping %d %s'%(i+1,time_str))
#发送,encode()将字符转换为字节
clientSocket.sendto(context.encode(),(serverName,serverPort))
#设置时长
clientSocket.settimeout(1.0)
#接收到server端报文
message,serverAddress=clientSocket.recvfrom(1024)
end_time=time.time()*1000
RTT=end_time-start_time
#求RTT总和以便后续求AverageRTT
Sum=Sum+RTT
#再循环中求最大的RTT和最小的RTT
if RTT>MaxRTT:
MaxRTT=RTT
if RTT<MinRTT:
MinRTT=RTT
modifiedMessage=message.decode()
print ("Reply from %s %s RTT=%fms" %(serverAddress,modifiedMessage,RTT))
except timeout:
print ('Request time out')
k=k+1
Lost=k*100/10 #Packet Lost Rate
AverageRTT=Sum/(10-k) #计算平均RTT
print('PacketLossRate %d %% MinRTT=%fms MaxRTT=%fms AverageRTT=%fms'%(Lost, MinRTT,MaxRTT,AverageRTT))
输出结果:
Request time out
Request time out
Request time out
Reply from ('127.0.0.1', 12000) PING 4 2020-03-22 14:00:00 RTT=0.996094ms
Reply from ('127.0.0.1', 12000) PING 5 2020-03-22 14:00:00 RTT=0.998291ms
Reply from ('127.0.0.1', 12000) PING 6 2020-03-22 14:00:00 RTT=0.996338ms
Reply from ('127.0.0.1', 12000) PING 7 2020-03-22 14:00:00 RTT=0.000000ms
Request time out
Reply from ('127.0.0.1', 12000) PING 9 2020-03-22 14:00:01 RTT=0.000000ms
Request time out
PacketLossRate 50 % MinRTT=0.000000ms MaxRTT=0.998291ms AverageRTT=0.598145ms