在右侧编辑器代码的receiveOnePing函数中的Begin与End之间补充代码,计算并返回报文延迟、TTL及double类型数据长度。
时间: 2024-04-10 21:26:52 浏览: 43
下面是一个示例代码,用于在 `receiveOnePing` 函数中计算并返回报文延迟、TTL、以及 double 类型数据的长度:
```python
import time
from struct import *
import socket
def receiveOnePing(my_socket, ID, timeout, dest_addr):
timeLeft = timeout
while True:
startedSelect = time.time()
whatReady = select.select([my_socket], [], [], timeLeft)
howLongInSelect = (time.time() - startedSelect)
if whatReady[0] == []: # Timeout
return "Request timed out."
timeReceived = time.time()
recPacket, addr = my_socket.recvfrom(1024)
# 解析 ICMP 报文
icmp_header = recPacket[20:28]
icmp_type, code, checksum, packet_ID, sequence = unpack("bbHHh", icmp_header)
if packet_ID == ID:
byte_size = len(recPacket) - 28 # 计算数据长度,减去 ICMP 头部长度
ttl = ord(struct.unpack("c", recPacket[8:9])[0]) # 获取 TTL 值
delay = (timeReceived - timeSent) * 1000 # 计算延迟时间(毫秒)
return delay, ttl, byte_size
timeLeft = timeLeft - howLongInSelect
if timeLeft <= 0:
return "Request timed out."
```
在上面的代码中,我们首先解析 ICMP 报文的头部,提取出 ICMP 类型、代码、校验和、报文 ID 和序列号等信息。然后,我们根据报文 ID 判断该报文是否为发送的报文的响应,并计算延迟时间、TTL 值以及数据长度。最后,我们将这些值作为元组返回。
请注意,上述代码片段是在完成了一些前置操作的上下文中使用的,例如在发送 ICMP 请求报文之后调用 `receiveOnePing` 函数来接收响应报文。因此,可能还需要进行适当的调整和集成才能完整运行。