搜索引擎介绍的博客,多数是 os.system 使用系统 ping 来判断去解决的,不是很合意,
再往一层,技巧就一下子深入到 sock 接口上生成 icmp 包去 sned 和 recive 并且设计到异步处理(全环节手工),有违使用 python 的初衷(其实不好抄代码到现在的代码里,要改很多逻辑),粗略看了一下 python 生态,似乎没有在 OSI 二层,三层或者四层专门去折腾 ARP,ICMP,IGMP,TTL 这些事情的库?
1
liprais 2021-05-22 01:43:54 +08:00 via iPhone
随便一搜就有 ping3,要啥自行车
|
2
phithon 2021-05-22 01:53:10 +08:00
|
3
billlee 2021-05-22 03:00:47 +08:00 1
RAW socket 需要 root 权限,/bin/ping 是个 suid 程序。
|
4
iBugOne 2021-05-22 10:42:55 +08:00 2
@billlee 曾经的 ping 确实是 suid 程序,现在 caps 流行起来后为了安全性取消了 suid,变成自带 cap_net_raw+ep 了
|
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 |
6
uti6770werty OP @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,延时和连续,稳定如老狗。。。 没啥更好便捷的,真准备上自行车了。。。。 |
7
nyakoy 2021-05-26 17:59:23 +08:00
我最近也有这种需求,如果楼主找到好的轮子,记得踢我一下
|
8
l4ever 2021-05-27 17:28:07 +08:00
我也有类似的需求, 自己写的用起来很爽.
我是用 socket 连 tcp 端口(和题主不一样, 我有维护目标 IP 和端口), 记录开始和结束时间, 从而得到延时. 多线程, 这样测试 20 次, 耗时不到 1 秒. |