只是测试 IP 地址存活状态,是否有好轮子?(os.system 使用系统的 ping 不算) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
uti6770werty
V2EX    Python

只是测试 IP 地址存活状态,是否有好轮子?(os.system 使用系统的 ping 不算)

  •  
  •   uti6770werty 2021-05-22 01:04:36 +08:00 3081 次点击
    这是一个创建于 1685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搜索引擎介绍的博客,多数是 os.system 使用系统 ping 来判断去解决的,不是很合意,
    再往一层,技巧就一下子深入到 sock 接口上生成 icmp 包去 sned 和 recive 并且设计到异步处理(全环节手工),有违使用 python 的初衷(其实不好抄代码到现在的代码里,要改很多逻辑),粗略看了一下 python 生态,似乎没有在 OSI 二层,三层或者四层专门去折腾 ARP,ICMP,IGMP,TTL 这些事情的库?

    8 条回复    2021-05-27 17:28:07 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       2021-05-22 01:43:54 +08:00 via iPhone
    随便一搜就有 ping3,要啥自行车
    phithon
        2
    phithon  
       2021-05-22 01:53:10 +08:00
    billlee
        3
    billlee  
       2021-05-22 03:00:47 +08:00   1
    RAW socket 需要 root 权限,/bin/ping 是个 suid 程序。
    iBugOne
        4
    iBugOne  
       2021-05-22 10:42:55 +08:00   2
    @billlee 曾经的 ping 确实是 suid 程序,现在 caps 流行起来后为了安全性取消了 suid,变成自带 cap_net_raw+ep 了
    yanqiyu
        5
    yanqiyu  
       2021-05-23 00:56:16 +08:00
    看了下我电脑里面的 ping,既没有 setuid 也没有 cap,strace 了一下是 SOCK_DGRAM 连接的,看了下文档这样子就不需要额外的特权了,并且校验和之类的工作会由内核代劳

    对应 python socket 大概是
    socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP)

    就能开这样一个 socket,之后看文档构造包头就能原生 python ping 了(我赌五毛有现成的轮子)

    refs: https://lkml.org/lkml/2010/12/21/195
    uti6770werty
        6
    uti6770werty  
    OP
       2021-05-24 23:21:14 +08:00
    @liprais 使用了 2,3 天,ping3 表现相当不靠谱(也有可能是我 PC 的问题,但不会是网络的问题)
    while True:
    time.sleep(1)
    respon = ping3.ping('192.168.33.13',unit='ms',size=128) # 局域网内
    print(respon)

    respon 可以是这样:
    14.000177383422852
    13.000011444091797
    13.000011444091797
    16.000032424926758
    0.0
    0.0
    0.0
    0.0
    0.0
    15.599727630615234
    0.0
    12.000083923339844
    11.00015640258789
    14.000177383422852
    12.000083923339844

    我在另外一个 cmd 窗口,ping -t,延时和连续,稳定如老狗。。。
    没啥更好便捷的,真准备上自行车了。。。。
    nyakoy
        7
    nyakoy  
       2021-05-26 17:59:23 +08:00
    我最近也有这种需求,如果楼主找到好的轮子,记得踢我一下
    luckyc
        8
    luckyc  
       2021-05-27 17:28:07 +08:00
    我也有类似的需求, 自己写的用起来很爽.
    我是用 socket 连 tcp 端口(和题主不一样, 我有维护目标 IP 和端口), 记录开始和结束时间, 从而得到延时.
    多线程, 这样测试 20 次, 耗时不到 1 秒.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2569 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 13:49 PVG 21:49 LAX 05:49 JFK 08:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86