복붙노트

[PYTHON] 네트워크 연결 확인 중

PYTHON

네트워크 연결 확인 중

온라인 API에 액세스 할 수 있는지보고 싶지만 인터넷 액세스가 필요합니다.

파이썬을 사용하여 연결이 가능하고 활성화되어 있는지 어떻게 알 수 있습니까?

해결법

  1. ==============================

    1.아마도 다음과 같이 사용할 수 있습니다.

    아마도 다음과 같이 사용할 수 있습니다.

    import urllib2
    
    def internet_on():
        try:
            urllib2.urlopen('http://216.58.192.142', timeout=1)
            return True
        except urllib2.URLError as err: 
            return False
    

    현재 216.58.192.142는 google.com의 IP 주소 중 하나입니다. http://216.58.192.142를 신속하게 대응할 것으로 예상되는 사이트로 변경하십시오.

    이 고정 IP는 google.com에 영원히 매핑되지 않습니다. 그래서이 코드는 강력하지는 않습니다 - 계속 작동시키기 위해서는 지속적인 유지 관리가 필요합니다.

    위의 코드가 FQDN (정규화 된 도메인 이름) 대신 고정 IP 주소를 사용하는 이유는 FQDN에 DNS 조회가 필요하기 때문입니다. 컴퓨터가 인터넷에 연결되어 있지 않으면 DNS 조회 자체가 urllib_request.urlopen에 대한 호출을 1 초 이상 차단할 수 있습니다. 이 문제를 지적 해 주신 @rzetterberg에게 감사드립니다.

    위의 고정 IP 주소가 작동하지 않는 경우 google.com (유닉스)의 현재 IP 주소는

    % dig google.com  +trace 
    ...
    google.com.     300 IN  A   216.58.192.142
    
  2. ==============================

    2.우리가 인터넷 서버에 연결할 수 있다면 우리는 실제로 인터넷에 연결할 수 있습니다. 그러나 가장 빠르고 신뢰할 수있는 접근 방법을 위해 모든 솔루션은 최소한 다음 요구 사항을 준수해야합니다.

    우리가 인터넷 서버에 연결할 수 있다면 우리는 실제로 인터넷에 연결할 수 있습니다. 그러나 가장 빠르고 신뢰할 수있는 접근 방법을 위해 모든 솔루션은 최소한 다음 요구 사항을 준수해야합니다.

    이 방법을 준수하려면 Google의 공용 DNS 서버 중 하나에 연결할 수 있는지 확인해야합니다. 이러한 서버의 IPv4 주소는 8.8.8.8 및 8.8.4.4입니다. 우리는 그들 중 누구에게나 연결을 시도 할 수 있습니다.

    호스트의 빠른 Nmap 8.8.8.8은 아래 결과를주었습니다 :

    $ sudo nmap 8.8.8.8
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2015-10-14 10:17 IST
    Nmap scan report for google-public-dns-a.google.com (8.8.8.8)
    Host is up (0.0048s latency).
    Not shown: 999 filtered ports
    PORT   STATE SERVICE
    53/tcp open  domain
    
    Nmap done: 1 IP address (1 host up) scanned in 23.81 seconds
    

    보시다시피, TCP / 53은 열려 있고 필터링되지 않습니다. 루트가 아닌 사용자 인 경우 Nmap에 sudo 또는 -Pn 인수를 사용하여 제작 된 검사 패킷을 보내고 호스트가 작동 중인지 확인하십시오.

    파이썬으로 시도하기 전에 외부 도구 Netcat을 사용하여 연결성을 테스트 해 봅시다.

    $ nc 8.8.8.8 53 -zv
    Connection to 8.8.8.8 53 port [tcp/domain] succeeded!
    

    Netcat은 우리가 TCP / 53을 통해 8.8.8.8에 도달 할 수 있음을 확인합니다. 이제 파이썬에서 8.8.8.8:53/TCP에 소켓 연결을 설정하여 연결을 확인할 수 있습니다 :

    >>> import socket
    >>>
    >>> def internet(host="8.8.8.8", port=53, timeout=3):
    ...   """
    ...   Host: 8.8.8.8 (google-public-dns-a.google.com)
    ...   OpenPort: 53/tcp
    ...   Service: domain (DNS/TCP)
    ...   """
    ...   try:
    ...     socket.setdefaulttimeout(timeout)
    ...     socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
    ...     return True
    ...   except Exception as ex:
    ...     print ex.message
    ...     return False
    ...
    >>> internet()
    True
    >>>
    

    또 다른 방법은 수작업으로 만들어진 DNS 프로브를 이들 서버 중 하나에 보내고 응답을 기다리는 것입니다. 하지만, 패킷 손실, DNS 분석 오류 등으로 인해 비교가 느려질 수 있습니다. 그렇지 않을 경우 의견을 말하십시오.

    업데이트 # 1 : @ theamk의 의견 덕분에, timeout은 이제 인수가되고 기본적으로 3 초로 초기화됩니다.

    업데이트 # 2 :이 질문에 대한 모든 유효한 대답의 가장 빠르고 가장 일반적인 구현을 식별하는 빠른 테스트를 수행했습니다. 요약은 다음과 같습니다.

    $ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
    defos.py
    True
    00:00:00:00.487
    
    iamaziz.py
    True
    00:00:00:00.335
    
    ivelin.py
    True
    00:00:00:00.105
    
    jaredb.py
    True
    00:00:00:00.533
    
    kevinc.py
    True
    00:00:00:00.295
    
    unutbu.py
    True
    00:00:00:00.546
    
    7h3rAm.py
    True
    00:00:00:00.032
    

    그리고 한 번 더 :

    $ ls *.py | sort -n | xargs -I % sh -c 'echo %; ./timeit.sh %; echo'
    defos.py
    True
    00:00:00:00.450
    
    iamaziz.py
    True
    00:00:00:00.358
    
    ivelin.py
    True
    00:00:00:00.099
    
    jaredb.py
    True
    00:00:00:00.585
    
    kevinc.py
    True
    00:00:00:00.492
    
    unutbu.py
    True
    00:00:00:00.485
    
    7h3rAm.py
    True
    00:00:00:00.035
    

    위 출력에서 ​​true는 각 작성자의 모든 구현이 인터넷 연결을 올바르게 식별 함을 나타냅니다. 시간은 밀리 초 단위로 표시됩니다.

    업데이트 # 3 : 예외 처리 변경 후 다시 테스트 :

    defos.py
    True
    00:00:00:00.410
    
    iamaziz.py
    True
    00:00:00:00.240
    
    ivelin.py
    True
    00:00:00:00.109
    
    jaredb.py
    True
    00:00:00:00.520
    
    kevinc.py
    True
    00:00:00:00.317
    
    unutbu.py
    True
    00:00:00:00.436
    
    7h3rAm.py
    True
    00:00:00:00.030
    
  3. ==============================

    3.HTML을 가져 오지 않도록 HEAD 요청 만하는 것이 더 빠릅니다. 또한 나는 구글이 그것을 더 좋아할 것이라고 확신한다 :)

    HTML을 가져 오지 않도록 HEAD 요청 만하는 것이 더 빠릅니다. 또한 나는 구글이 그것을 더 좋아할 것이라고 확신한다 :)

    try:
        import httplib
    except:
        import http.client as httplib
    
    def have_internet():
        conn = httplib.HTTPConnection("www.google.com", timeout=5)
        try:
            conn.request("HEAD", "/")
            conn.close()
            return True
        except:
            conn.close()
            return False
    
  4. ==============================

    4.unutbu가 Python 3.2에서 새로운 코드에 대해 말한 것을 업데이트하기 만하면됩니다.

    unutbu가 Python 3.2에서 새로운 코드에 대해 말한 것을 업데이트하기 만하면됩니다.

    def check_connectivity(reference):
        try:
            urllib.request.urlopen(reference, timeout=1)
            return True
        except urllib.request.URLError:
            return False
    

    여기에 입력 한 내용 (참조)은 확인하려는 URL입니다. 내가 살고있는 곳에 빠르게 연결되는 것을 선택하는 것이 좋습니다. 즉, 저는 한국에 거주하고 있습니다. 따라서 http : / / /www.naver.com.

  5. ==============================

    5.ubutnu의 / Kevin C 답변에 대한 대안으로 다음과 같은 요청 패키지를 사용합니다.

    ubutnu의 / Kevin C 답변에 대한 대안으로 다음과 같은 요청 패키지를 사용합니다.

    import requests
    
    def connected_to_internet(url='http://www.google.com/', timeout=5):
        try:
            _ = requests.get(url, timeout=timeout)
            return True
        except requests.ConnectionError:
            print("No internet connection available.")
        return False
    

    보너스 : 웹 사이트를 핑하는이 기능으로 확장 할 수 있습니다.

    def web_site_online(url='http://www.google.com/', timeout=5):
        try:
            req = requests.get(url, timeout=timeout)
            # HTTP errors are not raised by default, this statement does that
            req.raise_for_status()
            return True
        except requests.HTTPError as e:
            print("Checking internet connection failed, status code {0}.".format(
            e.response.status_code))
        except requests.ConnectionError:
            print("No internet connection available.")
        return False
    
  6. ==============================

    6.당신은 단지 데이터를 다운로드하려고 할 수 있습니다. 그리고 연결이 실패하면 연결이있는 일이 잘되지 않는다는 것을 알게 될 것입니다.

    당신은 단지 데이터를 다운로드하려고 할 수 있습니다. 그리고 연결이 실패하면 연결이있는 일이 잘되지 않는다는 것을 알게 될 것입니다.

    기본적으로 컴퓨터가 인터넷에 연결되어 있는지 확인할 수 없습니다. 잘못된 DNS 구성, 방화벽, NAT와 같은 많은 실패 원인이있을 수 있습니다. 따라서 몇 가지 테스트를 수행하더라도 시도 할 때까지 API와의 연결을 보장 할 수는 없습니다.

  7. ==============================

    7.

    import urllib
    
    def connected(host='http://google.com'):
        try:
            urllib.urlopen(host)
            return True
        except:
            return False
    
    # test
    print( 'connected' if connected() else 'no internet!' )
    

    파이썬 3의 경우 urllib.request.urlopen (host)을 사용하십시오.

  8. ==============================

    8.어쨌든하려고했던 작업을 시도하십시오. 실패하면 파이썬은 예외를 던져서 알려준다.

    어쨌든하려고했던 작업을 시도하십시오. 실패하면 파이썬은 예외를 던져서 알려준다.

    연결을 감지하기 위해 먼저 사소한 작업을 시도하면 경쟁 조건이 도입됩니다. 인터넷 연결이 테스트 중일 때 유효하지만 실제 작업을하기 전에 중단되면 어떻게됩니까?

  9. ==============================

    9.가장 좋은 방법은 파이썬이 웹 사이트를 찾을 수없는 경우 항상 제공하는 IP 주소를 확인하는 것입니다. 이 경우 이것은 내 코드입니다.

    가장 좋은 방법은 파이썬이 웹 사이트를 찾을 수없는 경우 항상 제공하는 IP 주소를 확인하는 것입니다. 이 경우 이것은 내 코드입니다.

    import socket
    
    print("website connection checker")
    while True:
        website = input("please input website: ")
        print("")
        print(socket.gethostbyname(website))
        if socket.gethostbyname(website) == "92.242.140.2":
            print("Website could be experiencing an issue/Doesn't exist")
        else:
            socket.gethostbyname(website)
            print("Website is operational!")
            print("")
    
  10. ==============================

    10.Unutbu의 답변을 출발점으로 삼아 "정적"IP 주소가 변경되어 과거에 불타 버린 경우, 나는 DNS 조회를 사용하여 한 번 확인하는 간단한 클래스를 만들었습니다 (예 : URL "https : // www .google.com "이라고 표시) 다음 후속 검사에 사용할 응답 서버의 IP 주소를 저장합니다. 그렇게하면 IP 주소가 항상 최신 상태로 유지됩니다 (클래스가 몇 년에 한 번 이상 초기화되는 경우). 나는 또한이 대답을 위해 gawry에게 신용을 줘서, 서버의 IP 주소를 얻는 방법을 보여 주었다. 이 솔루션의 명백한 해킹을 무시하십시오. 여기서는 최소한의 작업 예제 만 있습니다. :)

    Unutbu의 답변을 출발점으로 삼아 "정적"IP 주소가 변경되어 과거에 불타 버린 경우, 나는 DNS 조회를 사용하여 한 번 확인하는 간단한 클래스를 만들었습니다 (예 : URL "https : // www .google.com "이라고 표시) 다음 후속 검사에 사용할 응답 서버의 IP 주소를 저장합니다. 그렇게하면 IP 주소가 항상 최신 상태로 유지됩니다 (클래스가 몇 년에 한 번 이상 초기화되는 경우). 나는 또한이 대답을 위해 gawry에게 신용을 줘서, 서버의 IP 주소를 얻는 방법을 보여 주었다. 이 솔루션의 명백한 해킹을 무시하십시오. 여기서는 최소한의 작업 예제 만 있습니다. :)

    여기에 내가 가진 것이있다.

    import socket
    
    try:
        from urllib2 import urlopen, URLError
        from urlparse import urlparse
    except ImportError:  # Python 3
        from urllib.parse import urlparse
        from urllib.request import urlopen, URLError
    
    class InternetChecker(object):
        conn_url = 'https://www.google.com/'
    
        def __init__(self):
            pass
    
        def test_internet(self):
            try:
                data = urlopen(self.conn_url, timeout=5)
            except URLError:
                return False
    
            try:
                host = data.fp._sock.fp._sock.getpeername()
            except AttributeError:  # Python 3
                host = data.fp.raw._sock.getpeername()
    
            # Ensure conn_url is an IPv4 address otherwise future queries will fail
            self.conn_url = 'http://' + (host[0] if len(host) == 2 else
                                         socket.gethostbyname(urlparse(data.geturl()).hostname))
    
            return True
    
    # Usage example
    checker = InternetChecker()
    checker.test_internet()
    
  11. ==============================

    11.로컬 호스트가 127.0.0.1에서 변경된 경우 작동하지 않을 수 있습니다. 시험

    로컬 호스트가 127.0.0.1에서 변경된 경우 작동하지 않을 수 있습니다. 시험

    import socket
    ipaddress=socket.gethostbyname(socket.gethostname())
    if ipaddress=="127.0.0.1":
        print("You are not connected to the internet!")
    else:
        print("You are connected to the internet with the IP address of "+ ipaddress )
    

    편집하지 않는 한 인터넷에 연결되어 있지 않으면 컴퓨터 IP는 127.0.0.1이됩니다. 이 코드는 기본적으로 IP 주소를 얻은 다음 로컬 호스트 IP 주소인지 묻습니다. 희망은 도움이됩니다.

  12. ==============================

    12.Taking Six '대답 우리는 어떻게 든 단순화 할 수 있다고 생각합니다. 기술적 인 문제에서 신참이 없어지면서 중요한 문제입니다.

    Taking Six '대답 우리는 어떻게 든 단순화 할 수 있다고 생각합니다. 기술적 인 문제에서 신참이 없어지면서 중요한 문제입니다.

    여기에 내가 마침내 내 PV 모니터링을 위해 하루에 한 번씩 (3G, 느린) 연결을 기다리는 데 사용할 것입니다.

    Raspbian 3.4.2가 적용된 Pyth3에서 작동합니다.

    from urllib.request import urlopen
    from time import sleep
    urltotest=http://www.lsdx.eu             # my own web page
    nboftrials=0
    answer='NO'
    while answer=='NO' and nboftrials<10:
        try:
            urlopen(urltotest)
            answer='YES'
        except:
            essai='NO'
            nboftrials+=1
            sleep(30)       
    

    최대 달리기 : 도달하면 5 분 나는 한 시간의 시간이지만 스크립트의 다른 비트로 시도 할 것입니다!

  13. ==============================

    13.내가 좋아하는 스크립트가 클러스터에서 실행될 때

    내가 좋아하는 스크립트가 클러스터에서 실행될 때

    import subprocess
    
    def online(timeout):
        try:
            return subprocess.run(
                ['wget', '-q', '--spider', 'google.com'],
                timeout=timeout
            ).returncode == 0
        except subprocess.TimeoutExpired:
            return False
    

    이것은 wget을 조용히 실행하고 아무것도 다운로드하지 않고 주어진 원격 파일이 웹에 있는지 확인합니다.

  14. from https://stackoverflow.com/questions/3764291/checking-network-connection by cc-by-sa and MIT license