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

求赞求表扬

给我一个赞让我快落一下叭

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值