[PYTHON] 네트워크 연결 확인 중
PYTHON네트워크 연결 확인 중
온라인 API에 액세스 할 수 있는지보고 싶지만 인터넷 액세스가 필요합니다.
파이썬을 사용하여 연결이 가능하고 활성화되어 있는지 어떻게 알 수 있습니까?
해결법
-
==============================
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.우리가 인터넷 서버에 연결할 수 있다면 우리는 실제로 인터넷에 연결할 수 있습니다. 그러나 가장 빠르고 신뢰할 수있는 접근 방법을 위해 모든 솔루션은 최소한 다음 요구 사항을 준수해야합니다.
우리가 인터넷 서버에 연결할 수 있다면 우리는 실제로 인터넷에 연결할 수 있습니다. 그러나 가장 빠르고 신뢰할 수있는 접근 방법을 위해 모든 솔루션은 최소한 다음 요구 사항을 준수해야합니다.
이 방법을 준수하려면 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.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.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.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.당신은 단지 데이터를 다운로드하려고 할 수 있습니다. 그리고 연결이 실패하면 연결이있는 일이 잘되지 않는다는 것을 알게 될 것입니다.
당신은 단지 데이터를 다운로드하려고 할 수 있습니다. 그리고 연결이 실패하면 연결이있는 일이 잘되지 않는다는 것을 알게 될 것입니다.
기본적으로 컴퓨터가 인터넷에 연결되어 있는지 확인할 수 없습니다. 잘못된 DNS 구성, 방화벽, NAT와 같은 많은 실패 원인이있을 수 있습니다. 따라서 몇 가지 테스트를 수행하더라도 시도 할 때까지 API와의 연결을 보장 할 수는 없습니다.
-
==============================
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.어쨌든하려고했던 작업을 시도하십시오. 실패하면 파이썬은 예외를 던져서 알려준다.
어쨌든하려고했던 작업을 시도하십시오. 실패하면 파이썬은 예외를 던져서 알려준다.
연결을 감지하기 위해 먼저 사소한 작업을 시도하면 경쟁 조건이 도입됩니다. 인터넷 연결이 테스트 중일 때 유효하지만 실제 작업을하기 전에 중단되면 어떻게됩니까?
-
==============================
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.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.로컬 호스트가 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.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.내가 좋아하는 스크립트가 클러스터에서 실행될 때
내가 좋아하는 스크립트가 클러스터에서 실행될 때
import subprocess def online(timeout): try: return subprocess.run( ['wget', '-q', '--spider', 'google.com'], timeout=timeout ).returncode == 0 except subprocess.TimeoutExpired: return False
이것은 wget을 조용히 실행하고 아무것도 다운로드하지 않고 주어진 원격 파일이 웹에 있는지 확인합니다.
from https://stackoverflow.com/questions/3764291/checking-network-connection by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 컴파일 된 .pyc 파일을 .py 파일로 디 컴파일 할 수 있습니까? (0) | 2018.10.03 |
---|---|
[PYTHON] Google App Engine에서 파일 업로드 (0) | 2018.10.03 |
[PYTHON] 파이썬에 수학 nCr 함수가 있습니까? [복제] (0) | 2018.10.03 |
[PYTHON] scikit-learn K-Means Clustering을 사용하여 자신의 거리 함수를 지정할 수 있습니까? (0) | 2018.10.02 |
[PYTHON] PIL을 사용하여 투명한 png 이미지를 다른 이미지와 병합하는 방법 (0) | 2018.10.02 |