创建基于 UDP 的 Ping 程序

任务描述

本关任务:创建一个非标准的基于 UDP 的ping程序,需要输出数据包的源主机 IP 地址以及往返时延(RTT)。

相关知识

为了完成本关任务,你需要回顾第一个关卡的具体内容,包括:

  1. 创建socket对象;
  2. 发送 UDP 数据;
  3. 接收 UDP 数据;
  4. 设置超时

如果已经忘记了相关的内容,请返回第一关进行复习。

除此之外,你还需要掌握:

  1. Ping 的基本工作原理
  2. 计算往返时延 RTT
Ping 的基本工作原理
  • PING (Packet Internet Groper):因特网包探索器,用于测试网络连接量的程序。在现代操作系统中标准ping程序是一个网络诊断工具,客户端发送一个ping报文,接受一个从服务器返回的pong报文,标准的ping使用互联网控制报文协议( ICMP )。

  • 在本关卡中,您将创建一个非标准的基于 UDP 的ping程序。您的ping程序经 UDP 向目标服务器发送10ping报文,对于每个报文,当对应的pong报文返回时,你的客户要确定和打印 RTT。因为 UDP 是一个不可靠协议,由客户发送的分组可能会丢失。为此,客户不能无限期地等待对ping报文的回答。客户等待服务器回答的时间至多为1秒,如果没有收到回答,客户假定该分组丢失并相应地打印一条反馈信息。

计算往返时延 RTT
  • RTT (Round-Trip Time):往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延:

     
      
    1. RTT = 收到数据的时间 - 发送数据的时间
  • 往返延时由三个部分决定:即链路的传播时间、末端系统的处理时间以及路由器的缓存中的排队和处理时间。其中,前面两个部分的值作为一个TCP连接相对固定,路由器中缓存的排队和处理时间会随着整个网络拥塞程度的变化而变化。所以 RTT 的变化在一定程度上反映了网络拥塞程度的变化。

  • 本实验,你需要确定从客户端发送ping报文到接收到pong报文为止的时延。

  • 我们需要使用python中的time模块,该模块中的time()函数可以提供当前时间的时间戳:

     
      
    1. time.time() #表示当前时间的时间戳
编程要求

本实训使用python3进行编程,客户端将采用 UDP 方式连接服务器。你需要建立一个 UDP 套接字,并指定目的IP地址和端口,随之使用一个循环来发送数据包,共循环10次,你需要在右侧编辑器补充代码,完成客户器的功能,具体如下:

  1. 由于评测系统的服务器端文件和客户端文件位于同一台主机,我们可以使用localhost表示服务器端地址。

  2. 端口号为56789

  3. 设置超时时长为1秒。

  4. 客户端发送的内容为Ping x timex表示第几次发送。(你不需要将发送内容输出)

  5. 接收的内容为Receive x: Reply from y RTT = z,你需要将其输出,其中x表示收到第几次的报文,y是服务器的 IP 地址,该地址不包括端口号,z是往返时延 RTT,单位为s,并且保留小数点后两位有效数字,输出时需要加上单位,具体参考预期输出。

  6. 发生丢包时要有反馈信息,并且需要输出,内容为Sequence x: Request timed outx表示第几个数据包报发生丢失,具体参考预期输出。

测试说明

平台会对你编写的代码进行测试:

预期输出: Receive 1: Reply from 127.0.0.1 RTT = 0.80s Receive 2: Reply from 127.0.0.1 RTT = 0.50s Receive 3: Reply from 127.0.0.1 RTT = 0.80s Receive 4: Reply from 127.0.0.1 RTT = 0.50s Sequence 5: Request timed out Receive 6: Reply from 127.0.0.1 RTT = 0.20s Receive 7: Reply from 127.0.0.1 RTT = 0.50s Receive 8: Reply from 127.0.0.1 RTT = 0.80s Receive 9: Reply from 127.0.0.1 RTT = 0.80s Receive 10: Reply from 127.0.0.1 RTT = 0.50s


开始你的任务吧,祝你成功!

from socket import *
import time

#********* Begin *********#
# 指定服务器地址和端口
addressPort = ("localhost", 56789)
#********* End *********#

#********* Begin *********#
# 创建UDP套接字
s = socket(AF_INET, SOCK_DGRAM)
#********* End *********#

#********* Begin *********#
# 设置套接字超时值1秒
s.settimeout(1)
#********* End *********#

i = 1
while i <= 10:
    sendTime = time.time() # 记录发送ping报文的当前时间戳
    try:
        # ********* Begin *********#
        # 生成数据报,编码为bytes,并发送给服务器
        data = bytes("Ping " + str(i) + " time", encoding='utf-8')
        s.sendto(data, addressPort)
        # ********* End *********#

        # ********* Begin *********#
        # 从服务器接收信息,同时也能得到来自服务器的地址,需要输出该地址,(不要输出端口号!)
        # 并且需要计算和输出RTT,具体见编程要求

        data, server_address = s.recvfrom(1024)
        end_time = time.time()  # 记录接收时间
        rtt = round(end_time - sendTime, 2)  # 计算往返时延
        print('Receive %d: Reply from %s RTT = %.2fs' % (i, server_address[0], rtt))

        # ********* End *********#

    except Exception as e:

        # ********* Begin *********#
        # 输出超时丢包的反馈信息。
        print(f'Sequence {i}: Request timed out')
        # ********* End *********#

    i = i + 1

#********* Begin *********#
# 关闭该UDP套接字
s.close()
#********* End *********#

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目录 前言 第1章 Windows CE及开发环境概述 1.1 Windows CE概述 1.1.1 Windows CE嵌入式系统概述 1.1.2 Windows CE版本 1.1.3 Windows CE 6.0概述 1.1.4 嵌入式开发流程 1.2 开发环境概述 1.2.1 Visual Studio 2005的Visual C++——Windows CE开发环境概述 1.2.2 示例程序HelloWorld 1.3 Windows CE附带远程工具概述 第2章 图形编程 2.1 设备环境类 2.2 图形对象类(GDI) 2.3 绘制各种图形 2.4 绘制位图 2.4.1 CDC绘图函数描述 2.4.2 动画效果 2.4.3 抓屏 2.4.4 图形显示特技 2.5 显示压缩格式图片 2.5.1 SHLoadImageFile方法 2.5.2 Imaging技术 2.6 简单二维曲线示例 2.6.1 二维曲线类C2Dgraph的创建 2.6.2 使用二维曲线类C2DGraph绘制曲线 第3章 对话框控件 3.1 常用控件 3.1.1 微调按钮 3.1.2 滑动条 3.1.3 进度条 3.1.4 列表视图控件 3.1.5 树控件 3.2 创建图形显示控件 3.3 创建LED数字显示控件 第4章 进程 4.1 进程 4.1.1 进程概述 4.1.2 进程创建 4.1.3 进程终止 4.1.4 其他进程函数 4.1.5 “进程列举并管理”实例 4.2 进程间通讯 第5章 线程 5.1 线程 5.1.1 线程概述 5.1.2 线程优先级 5.1.3 线程API函数 5.2 线程同步 5.2.1 未使用线程同步 5.2.2 利用事件同步 5.2.3 利用互斥同步 5.2.4 利用临界区同步 5.2.5 利用信号量同步 第6章 文件 6.1 文件基本操作 6.2 文件综合操作示例 6.3 内存映射文件 6.3.1 内存映射文件概述 6.3.2 利用内存映射文件实现进程间通讯 6.4 文件系统管理 6.5 注册表编程 6.5.1 注册表简介 6.5.2 注册表API函数 6.5.3 注册表操作举例 第7章 多媒体编程 7.1 Direct Show介绍 7.1.1 DirectShow技术框架 7.1.2 过滤器(Filter) 7.1.3 Filter Graph Manager 7.1.4 Pin 7.1.5 DirectShow 接口定义介绍 7.2 媒体播放器示例 7.3 摄像头捕捉示例 7.3.1 摄像头捕捉概述 7.3.2 摄像头捕捉示例 第8章 Windows CE基础数据库编程 8.1 EDB概述 8.1.1 装配数据卷 8.1.2 卸载数据库卷 8.1.3 创建数据库 8.1.4 创建会话对象 8.1.5 打开数据库 8.1.6 事务操作 8.1.7 删除数据库 8.1.8 枚举数据库卷以及数据库 8.1.9 查找或移动记录 8.1.10 写记录 8.1.11 读取记录 8.1.12 删除记录 8.1.13 流操作 8.2 数据库操作综合示例 第9章 SQLCE数据库编程 9.1 SQL Server FOR CE的介绍 9.1.1 SQLCE简介 9.1.2 SQL Server CE 3.0的安装 9.1.3 SQLCE 3.0连接配置 9.2 OLEDB 编程访问SQLCE 3.0 9.2.1 OLE DB 概述 9.2.2 OLEDB 编程 9.3 SQLCE远程数据访问 9.3.1 Pull(拉数据) 9.3.2 Push(推数据) 9.3.3 Submit(远程T-SQL操作) 9.4 远程数据访问综合示例 第10章 串口编程 10.1 串口概述 10.2 串口编程API函数介绍 10.3 CE串口综合示例 10.4 GPS编程示例 第11章 网络编程概述 11.1 套接字编程基础 11.1.1 WinSock初始化和释放 11.1.2 创建套接字 11.1.3 关闭套接字 11.1.4 绑定套接字 11.1.5 监听套接字 11.1.6 等待连接 11.1.7 建立连接 11.1.8 发送数据 11.1.9 接收数据 11.1.10 设置套接字模式 11.1.11 Select I/O模型 11.2 PING编程 11.2.1 PING编程概述 11.2.2 PING编程示例 11.3 RAS拨号编程 11.3.1 建立拨号连接 11.3.2 关闭拨号连接 11.3.3 列举已建立的活动连接 11.3.4 列举电话簿条目 第12章 UDP编程 12.1 UDP编程概述 12.2 UDP编程示例 第13章 TCP编程 13.1 TCP编程概述 13.2 TCP客户端示例 13.3 TCP服务器端示例 第14章 DLL编程 14.1 DLL概述 14.2 DLL的调用 14.2.1 静态调用 14.2.2 动态调用 14.3 DLL的创建 14.3.1 Windows CE DLL的创建 14.3.2 基于MFC的Regular DLL的创建 14.3.3 资源DLL 第15章 COM编程 15.1 COM基本知识概述 15.1.1 什么是COM 15.1.2 什么是接口 15.1.3 COM基本结构 15.2 使用ATL创建COM示例 15.2.1 ATL对COM支持概述 15.2.2 ATL创建COM对象示例 15.2.3 创建客户端调用CEComServer 15.3 可连接点对象及示例 15.3.1 可连接点对象概述 15.3.2 连接点示例 15.4 创建ActiveX控件 15.4.1 ActiveX概述 15.4.2 使用MFC向导创建一个简单的ActiveX控件
精通Windows Sockets网络开发——基于Visual C++实现 目 录 第1篇网络开发基础篇 第1章准备开发环境 1.1windows sockets开发概述 1.1.1网络程序开发应用 1.1.2网络程序结构——c/s、b/s 1.1.3网络程序通信基础——网络协议 1.1.4网络程序通信技术——windows sockets介绍 1.2连接网络 1.2.1tcp/ip设置 1.2.2tcp/ip是否工作正常 1.2.3系统与网络适配器间的通信 1.2.4默认网关 1.2.5ping其他计算机ip地址 1.3创建应用程序 1.3.1控制台程序 1.3.2mfc应用程序 1.4调试两个应用程序 1.4.1启动两个工程 1.4.2将一个工程加入到另一个工程空间 1.5配置开发环境 1.6小结 第2章tcp/ip简介 2.1开放系统互连参考模型 2.2tcp/ip协议概述 2.2.1tcp/ip模型 2.2.2udp 2.2.3tcp 2.2.4端口 2.3小结 第3章windows sockets基础 3.1windows sockets 3.1.1应用程序与windows sockets的关系 3.1.2套接字 3.2协议特征 3.2.1面向连接与面向无连接 3.2.2可靠性与次序性 3.2.3面向消息 3.2.4部分消息 3.2.5从容关闭 3.2.6路由选择 3.2.7广播数据 3.3ip定址 3.3.1ip定址 3.3.2字节顺序问题 3.4基本tcp套接字编程 3.4.1wsastartup()函数 3.4.2socket()函数 3.4.3bind()函数 3.4.4listen()函数 3.4.5accept()函数 3.4.6recv()函数 3.4.7send()函数 3.4.8closesocket()函数 3.4.9shutdown()函数 3.4.10connect()函数 3.5tcp示例程序 3.5.1服务器实现 3.5.2客户端实现 3.6基本udp套接字编程 3.6.1recvfrom()函数 3.6.2sendto()函数 3.7udp示例程序 3.7.1服务器实现 3.7.2客户端实现 3.8套接字选项41 3.8.1getsockopt()函数 3.8.2setsockopt()函数 3.8.3sol_socket选项级别 3.9小结 第2篇visual c++网络模式开发篇 第4章阻塞模式开发 第5章非阻塞模式开发 第6章select模型开发 第7章wsaasyncselect模型开发 第8章wsaeventselect模型开发 第9章重叠i/o模型开发 第10章完成端口模型开发
1.怎样在C++Builder中创建使用DLL 2.用C++Bulider在WIN.INI中保存信息 3.如何在C++Builder中检测硬件 4.C++Builder如何响应消息及自定义消息 5.利用C++ Builder开发动画DLL 6.用C++ Builder 3制作屏幕保护程序 7.TCP/IP头格式 8.UDP 9.判断windows的Desktop及其它目录 10用C++Builder创建数字签名 11用Enter 键控制焦点切换的方法 12.拦 截 Windows 消 息 13.使用CommaText 14.程序开始时先显示信息框 15.怎样获取程序的命令行参数? 16.如何监视剪贴板 17.如何使用OnIdle事件 18.用C++Builder编写串行异步通信程序 19.C++BUILDER非可视组件的消息处理技巧 20.用C++Builder 建立数据库VCL使用经验 21.用C++ Builder创建基于Internet的点对点Chat 22.用C++Builder获取应用程序图标 23.BIG5到GB的转换技术 24.C++BUILDER让你的任务栏图标动起来 25.TFORM 26.用BCB在windows桌面创建快捷方式 27.读磁片磁区 28.I/O 端口读写的实现 29.检测鼠标位置 30.令Win32 应用程序跳入系统零层 31.如何取得Memo的行和列 32.使用Sockets 33.Windows95/98下怎样隐藏应用程序不让它出现在CTRL-ALT-DEL对话框中? 34.怎样隐藏应用程序的任务条图标 35.编写自己的Ping.exe程序 36.用C++Builder在WINNT下编制一个Service 37.如何在C++ BUILDER中自动关闭WINDOWS屏保 38.显示/隐藏任务栏图标 39.信箱监视程序 40.C++Building制作闹钟 41.拨号上网IP地址的检知 42.用C++ Builder编写Tray程序 43.怎样用代码来最小化或恢复程序 44.制作主窗口显示前的版权窗口 45.判断是否已经联到 internet 46.获取登陆用户名 47.隐藏桌面图标 48.程序启动时运行 49.控制面板的调用 50.模拟键盘按键 51.让标题栏闪烁 52.启动屏幕保护 53.年月日星期的取法 54.键盘事件 55.隐藏任务栏 56.禁止关机 57.怎样以最小化方式启动程序 58.在Memo中增加一行后,如何使最后一行能显示 59.设置壁纸方法
### 回答1: 编程实现基于UDPping可以通过以下步骤来完成: 1. 导入所需的库:首先,需要导入Python的socket库,以便在程序中使用UDP套接字。 2. 创建UDP套接字:使用socket库创建一个UDP套接字,可以通过调用`socket.socket(socket.AF_INET, socket.SOCK_DGRAM)`来实现。 3. 设置超时时间:使用`socket.settimeout()`函数来设置套接字的超时时间,以便在接收响应时等待的最长时间。 4. 发送ping消息:使用套接字的`sendto()`函数来发送ping消息。可以选择发送一个特定的字符串作为ping消息。 5. 接收响应:使用套接字的`recvfrom()`函数来接收对ping消息的响应。可以选择接收一个特定大小的字节流。 6. 计算往返时间:从收到的响应中获取发送ping消息的时间戳,然后计算往返时间(RTT)。 7. 打印结果:根据ping的结果,打印出发送ping消息的IP地址、往返时间和响应状态。 8. 关闭套接字:最后,使用套接字的`close()`函数来关闭UDP套接字。 一个简单的基于UDPping程序的示例代码如下: ```python import socket import time def udp_ping(hostname, port): try: # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设置超时时间为1秒 sock.settimeout(1) # 发送ping消息 start_time = time.time() sock.sendto(b'ping', (hostname, port)) # 接收响应 data, addr = sock.recvfrom(1024) end_time = time.time() # 计算往返时间 rtt = end_time - start_time # 打印结果 print('Ping from', addr[0], 'RTT:', rtt, 's') except socket.timeout: # 超时处理 print('Ping request timed out') finally: # 关闭套接字 sock.close() # 测试 udp_ping('localhost', 8080) ``` 这是一个简单的基于UDPping程序,它通过发送ping消息并等待响应来计算往返时间。在接收响应时,如果超过了设定的超时时间,程序将打印出"Ping request timed out"表示超时。 请注意,这只是一个基本示例,实际上,可以根据需要进行更多的改进和扩展,例如通过发送多个ping消息进行统计或添加其他ping功能。 ### 回答2: 基于UDP(用户数据报协议)实现ping功能需要以下步骤: 1. 导入必要的库:首先需要导入socket库来实现网络连接和发送/接收数据。 2. 创建一个UDP套接字:使用socket库的`socket(AF_INET, SOCK_DGRAM)`函数来创建一个UDP套接字。 3. 设定服务器地址和端口:使用`bind()`函数将服务器的IP地址和端口绑定到套接字上。 4. 设置超时时间:使用`settimeout()`函数设置等待数据的超时时间,即等待服务器响应的最长时间。 5. 发送和接收数据:使用`sendto()`函数将ping请求发送给服务器。然后使用`recvfrom()`函数等待服务器的响应。如果超过超时时间,服务器未响应,会抛出异常。如果接收到响应,计算往返时间(RTT)。 7. 输出结果:在控制台输出服务器的IP地址,发送/接收的数据包的大小和往返时间。 以下是一个示例的基于UDPping程序: ```python import socket import time # 创建UDP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 设定服务器地址和端口 server_address = ('127.0.0.1', 12345) sock.bind(server_address) # 设置超时时间 sock.settimeout(1) # 发送和接收数据 for i in range(10): start_time = time.time() # 发送ping请求 message = f'Ping {i}'.encode() sock.sendto(message, server_address) try: # 等待服务器的响应 data, address = sock.recvfrom(1024) end_time = time.time() # 计算往返时间 rtt = end_time - start_time # 输出结果 print(f'Reply from {address[0]}: bytes={len(data)}, time={round(rtt * 1000, 2)}ms') except socket.timeout: print('Request timed out') # 关闭套接字 sock.close() ``` 此示例会向服务器发送10个ping请求,并等待服务器的响应。如果超过1秒钟没有收到响应,会输出"Request timed out"。收到响应后,会输出服务器的IP地址、发送/接收的数据包大小以及往返时间。 ### 回答3: 编程实现基于UDPping可以通过以下步骤来完成: 1. 导入必要的库和模块,例如socket库用于实现网络通信。 2. 创建一个UDP套接字对象,可以使用socket库中的socket函数来实现。 3. 设置超时时间,以便在等待服务器响应时能够控制等待时间。 4. 循环发送ping消息给服务器,并接收服务器的响应。 5. 在发送ping消息之前,记录当前时间作为开始时间。 6. 通过套接字对象的sendto函数将ping消息发送到服务器的特定地址和端口。 7. 接收服务器的响应消息,并记录接收到响应时的时间。 8. 计算往返时间(RTT)时间,即接收到响应时的时间减去发送时的时间。 9. 打印出接收到的响应消息、往返时间和服务器的地址和端口信息。 10. 重复步骤4-9,直到达到指定的次数或设置了终止ping的条件。 11. 统计和计算平均往返时间和丢包率等相关统计信息。 12. 关闭套接字。 编程实现基于UDPping可以通过上述步骤来完成。这个程序可以用于测试服务器的可用性和计算网络的RTT等指标。在实际使用中,还可以根据具体的需求对程序进行扩展和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值