计算机网络-套接字编程作业(2)-UDP ping程序

作业2: UDP ping程序
官方给的服务端端代码:
UDPPingServer.py

import random
from socket import *

serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', 12000))

while True:
    rand = random.randint(0, 10)
    message, address = serverSocket.recvfrom(1024)
    message = message.upper()
    if rand < 4:
        continue
    serverSocket.sendto(message, address)

需要自己编写客户端代码,要求
1)发送10个ping的报文到服务器, 格式是:Ping 序号 时间
2) 打印服务器返回的报文
3)计算每个返回报文的RTT时间(往返时间),并打印
4)每个报文的等待服务器回答时间至多1秒,超时则打印报文丢失
因为UDP是非可靠的数据传输协议,我们使用随机数来模拟数据包丢失,设置一个1s的超时响应。
UDPPingClient.py

import time
from socket import *

serverName = '10.21.2.185' # 主机
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
clientSocket.settimeout(1)  # 设置超时

for i in range(0, 10):
    sendTime = time.time()
    message = ('Ping %d %s' % (i + 1, sendTime)).encode()
    try:
        clientSocket.sendto(message, (serverName, serverPort)) # 发送数据
        modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # 接收服务器的响应
        rtt = time.time() - sendTime # 计算往返时间
        print('Sequence %d: Reply from %s, RTT = %fs' % (i+1, serverName, rtt))
    except Exception as e:
        print('Sequence %d: Request timed out' % (i+1)) # 处理异常
# 关闭链接
clientSocket.close()

运行:

1)打开一个终端运行 python3 UDPPingServer.py 或者 python UDPPingServer.py (python2.x, python3.x其实都可以)
2)打开另外一个终端运行 python3 UDPPingClient.py 或者 python UDPPingClient.py
结果如下:

UDPPingServer.png

UDPPingClient.png

可选练习

  1. 计算所有报文往返时间的最大值、最小值、平均值及丢包率

  2. 实现UDP Heartbeat(客户端和服务器端)

练习1:

from socket import *
import time

serverName = '10.21.2.185'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
timeout = 1
clientSocket.settimeout(timeout)
rttTimes = []
failPing = 0
for i in range(0, 10):
    sendTime = time.time()
    message = ('Ping %d %s' % (i + 1, sendTime)).encode()
    try:
        clientSocket.sendto(message, (serverName, serverPort))
        modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
        rtt = time.time() - sendTime
        rttTimes.append(rtt)
        print('Sequence %d: Reply from %s, RTT = %fs' % (i+1, serverName, rtt))
    except Exception as e:
        failPing = failPing + 1
        rttTimes.append(timeout)
        print('Sequence %d: Request timed out' % (i+1))
maxTime = max(*rttTimes)
minTime = min(*rttTimes)
sumTime = 0
for x in range(len(rttTimes)):
    sumTime += rttTimes[x]
avgTime = sumTime / len(rttTimes)
loseRate = failPing / 10.0 * 100
print('The minimum RTT: %fs \nThe maximum RTT: %fs \nThe average RTT: %fs' % (minTime, maxTime, avgTime))
print('The packet loss rate: %.2f%%' % (loseRate))
clientSocket.close()

练习2:
超标了,目前不会做 ( ̄ー ̄)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、TCP为什么需要3次握手,4次断开? “三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端...
    杰伦哎呦哎呦阅读 3,684评论 0 6
  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 2,825评论 0 2
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,242评论 0 8
  • 本书结构是自顶向下的,所以请按下列顺序阅读: 1.计算机网络自顶向下--应用层2.计算机网络自顶向下--运输层3....
    牛富贵儿阅读 3,252评论 0 3
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,419评论 6 174

友情链接更多精彩内容