【问题标题】:System network connectivity? WITHOUT reaching out [Windows, MacOS, Ubuntu]系统网络连接?无需联系 [Windows、MacOS、Ubuntu]
【发布时间】:2015-11-02 20:39:19
【问题描述】:

我知道

ping -c 1 8.8.8.8

干净便携的方式怎么样? 我认为最好的方法是检查syslog 的最后一个请求或询问网络管理员何时在场,但除了 Android (http://developer.android.com/reference/android/net/ConnectivityManager.html) 我找不到任何东西...

我正在使用 Python,但此代码不存在...

import sys
sys.getnetworkstatus() # True when recent succesful connection went through

任何指针?

【问题讨论】:

  • 不能保证能够 ping 通 google 的一台 dns 服务器就意味着您有连接。许多防火墙会吃掉 ICMP。
  • "*清洁便携的方式怎么样?"一种干净便携的方式来做什么?你想完成什么?
  • "系统是否在线"
  • 类似于运行tcpdump,但不需要特权和资源,其想法是表现得像 Skype 客户端:断开连接时,警告用户。但是利用系统属性,而不是外部资源。

标签: python system connectivity


【解决方案1】:

以下程序将告诉您是否已连接到互联网。

import netifaces
def is_connected_to_an_internet():
    ifaces = netifaces.interfaces()
    for iface in ifaces:
        addrs = netifaces.ifaddresses(iface)
        for addr in addrs.get(netifaces.AF_INET, []):
            if addr['addr'].startswith('127'): continue
            return True
        for addr in addrs.get(netifaces.AF_INET6, []):
            if addr['addr'] == '::1': continue
            if addr['addr'].lower().startswith('fe80'): continue
            return True
    return False

参考:https://pypi.python.org/pypi/netifaces

【讨论】:

  • 很好,绝对是正确的方向!但是检查接口是否启动有点太简单了(如果我理解你的 sn-p 正确的话)。我想要更可靠的东西,但它确实达到了预期的效果
  • 它必须“太简单”。您已经指定了约束条件,“无需伸出援手”。
  • 是的 :) 非常感谢。我只是希望有一个统一的“最近的网络连接成功的事情”我会把它留到明天并接受你的回答
【解决方案2】:

“系统是否在线”是一个未充分说明的问题。你真正想要回答的问题是:

我现在可以访问远程主机上的远程服务吗?

只有一个有效的答案:

试试看吧。

您可以查看系统配置的任何方面,接口是否启动,是否有有效的 IP 地址,是否通过代理连接,NAT 框是否在 natting,远程服务是否正在运行,是否有到远程服务的路径拥塞和丢弃数据包,等等。所有这些以及更多只会产生您真正正在寻找的答案的近似值。

即使您在一秒钟前就已经成功联系到您想要的服务,但它告诉您的信息远比您希望现在联系它要少得多。

【讨论】:

  • 是的,我理解这类似于询问枪支是否还有 amo 并在不开火的情况下回答...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2012-04-09
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多