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

2021-05-22 01:04:36 +08:00
 uti6770werty

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

2446 次点击
所在节点    Python
8 条回复
liprais
2021-05-22 01:43:54 +08:00
随便一搜就有 ping3,要啥自行车
phithon
2021-05-22 01:53:10 +08:00
billlee
2021-05-22 03:00:47 +08:00
RAW socket 需要 root 权限,/bin/ping 是个 suid 程序。
iBugOne
2021-05-22 10:42:55 +08:00
@billlee 曾经的 ping 确实是 suid 程序,现在 caps 流行起来后为了安全性取消了 suid,变成自带 cap_net_raw+ep 了
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
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
2021-05-26 17:59:23 +08:00
我最近也有这种需求,如果楼主找到好的轮子,记得踢我一下
l4ever
2021-05-27 17:28:07 +08:00
我也有类似的需求, 自己写的用起来很爽.
我是用 socket 连 tcp 端口(和题主不一样, 我有维护目标 IP 和端口), 记录开始和结束时间, 从而得到延时.
多线程, 这样测试 20 次, 耗时不到 1 秒.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778472

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX