socket编程疑问之send后加sleep

socket通信中Linux下默认缓存大于window默认缓存大小,
send后需加Sleep(10)以使得接收方接收数据?不知道什么原理?
实现ping命令的关键在于向目标主机发送ICMP数据包并接收回复。以下是一个使用socket编程实现ping命令的Python代码示例: ```python import os import socket import struct import select import time ICMP_ECHO_REQUEST = 8 # ICMP类型码,代表Echo请求 def checksum(data): """计算ICMP数据包的校验和""" if len(data) % 2 == 1: data += b'\x00' words = struct.unpack('!%sH' % (len(data) // 2), data) sum_ = sum(words) sum_ = (sum_ >> 16) + (sum_ & 0xffff) sum_ += sum_ >> 16 return ~sum_ & 0xffff def send_ping(sock, dest_addr, pid, seq): """向目标主机发送一个Echo请求""" checksum_ = 0 # 构造ICMP头部 header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, checksum_, pid, seq) # 构造ICMP数据 data = b'Hello, World!' checksum_ = checksum(header + data) header = struct.pack('bbHHh', ICMP_ECHO_REQUEST, 0, socket.htons(checksum_), pid, seq) packet = header + data # 发送数据包并记录发送时间 start_time = time.time() sock.sendto(packet, (dest_addr, 1)) return start_time def receive_ping(sock, pid, seq, timeout): """从socket接收一个Echo回复""" time_left = timeout while True: start_time = time.time() # 使用select等待可读socket ready = select.select([sock], [], [], time_left) if not ready[0]: return None # 从socket读取数据 recv_packet, addr = sock.recvfrom(1024) # 解析ICMP头部 icmp_header = recv_packet[20:28] type_, code, checksum_, recv_pid, recv_seq = struct.unpack('bbHHh', icmp_header) # 如果收到的是Echo回复,则返回接收时间 if type_ == 0 and code == 0 and recv_pid == pid and recv_seq == seq: return time.time() - start_time # 更新等待时间 time_left -= time.time() - start_time if time_left <= 0: return None def ping(dest_addr, count=4, timeout=2): """向目标主机发送多个Echo请求,并打印结果""" pid = os.getpid() seq = 0 # 创建ICMP socket sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) for i in range(count): seq += 1 # 发送Echo请求并记录发送时间 start_time = send_ping(sock, dest_addr, pid, seq) # 接收Echo回复并记录接收时间 receive_time = receive_ping(sock, pid, seq, timeout) # 打印结果 if receive_time is None: print(f'Ping {dest_addr} ({i+1}/{count}): Timeout') else: print(f'Ping {dest_addr} ({i+1}/{count}): {round(receive_time*1000)}ms') # 等待一段时间后发送下一个Echo请求 time.sleep(1) sock.close() ``` 使用示例: ```python ping('www.baidu.com') ``` 输出: ``` Ping www.baidu.com (1/4): 22ms Ping www.baidu.com (2/4): 23ms Ping www.baidu.com (3/4): 22ms Ping www.baidu.com (4/4): 22ms ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值