开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 215|回复: 1
收起左侧

[python] 网站测速 ping 二进制的包 怎么写

[复制链接]
结帖率:0% (0/3)
发表于 3 天前 | 显示全部楼层 |阅读模式   浙江省嘉兴市
8精币

怎么写二进制的包,服务器



回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:54% (7/13)

签到天数: 15 天

发表于 前天 04:53 | 显示全部楼层   浙江省嘉兴市
[Python] 纯文本查看 复制代码
import socket
import struct
import time
import os
import sys

def calculate_checksum(data):
    s = 0
    for i in range(0, len(data), 2):
        if i + 1 < len(data):
            a = data
            b = data[i + 1]
            s += (a + (b << 8))
        else:
            s += data
    s = (s >> 16) + (s & 0xffff)
    s += s >> 16
    return ~s & 0xffff

def create_icmp_packet(id, seq):
    type = 8
    code = 0
    checksum = 0
    identifier = id
    sequence = seq
    data = b'Hello, this is a ping packet.'

    header = struct.pack('!BBHHH', type, code, checksum, identifier, sequence)
    checksum = calculate_checksum(header + data)
    header = struct.pack('!BBHHH', type, code, socket.htons(checksum), identifier, sequence)
    return header + data

def ping(host, count=4):
    try:
        dest_addr = socket.gethostbyname(host)
    except socket.gaierror:
        print(f"无法解析主机名: {host}")
        return

    try:
        if os.name == 'nt':
            sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
        else:
            sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
        sock.settimeout(2)
    except PermissionError:
        print("运行此程序需要管理员/root权限")
        return

    pid = os.getpid() & 0xFFFF
    sent_packets = 0
    received_packets = 0
    rtt_min = float('inf')
    rtt_max = 0
    rtt_sum = 0

    print(f"正在Ping {host} [{dest_addr}] 具有 56(84) 字节的数据:")

    for seq in range(count):
        packet = create_icmp_packet(pid, seq)
        sent_time = time.time()

        try:
            sock.sendto(packet, (dest_addr, 1))
            sent_packets += 1

            recv_packet, addr = sock.recvfrom(1024)
            recv_time = time.time()
            received_packets += 1

            icmp_header = recv_packet[20:28]
            icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq = struct.unpack('!BBHHH', icmp_header)

            if icmp_type == 0 and icmp_id == pid:
                rtt = (recv_time - sent_time) * 1000
                rtt_min = min(rtt_min, rtt)
                rtt_max = max(rtt_max, rtt)
                rtt_sum += rtt
                print(f"来自 {dest_addr} 的回复: 字节=56 时间={rtt:.2f}ms TTL=64")
        except socket.timeout:
            print("请求超时。")
        except Exception as e:
            print(f"发生错误: {e}")

    sock.close()

    print(f"\n{host} 的Ping统计信息:")
    print(f"    数据包: 已发送 = {sent_packets}, 已接收 = {received_packets}, 丢失 = {sent_packets - received_packets} ({(sent_packets - received_packets)/sent_packets*100:.1f}% 丢失),")
    
    if received_packets > 0:
        print("往返行程的估计时间(以毫秒为单位):")
        print(f"    最短 = {rtt_min:.2f}ms, 最长 = {rtt_max:.2f}ms, 平均 = {rtt_sum/received_packets:.2f}ms")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        target = sys.argv[1]
    else:
        target = input("请输入要Ping的主机名或IP地址或者服务器IP: ")
    ping(target)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表