이 코드 예제는 "CPython Internals" 책에 나와 있습니다.
from queue import Queue
import socket
import time
timeout = 1.0
def check_port(host: str, port: int, results: Queue):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
if result == 0:
results.put(port)
sock.close()
if __name__ == '__main__':
start = time.time()
host = "localhost"
results = Queue()
for port in range(80, 100):
check_port(host, port, results)
while not results.empty():
print("Port {0} is open".format(results.get()))
print("Completed scan in {0} seconds".format(time.time() - start))
이면 host == 'localhost'
이 스크립트는 매우 빠르게 실행되며(모든 포트(1 ~ 65535)는 약 1.5초 안에 확인됩니다!) 또한 시간 초과 기간은 아무런 역할도 하지 않습니다.
호스트를 "8.8.8.8"이나 다른 외부 호스트로 설정하면 스크립트 실행 시간이 올바르게 보입니다. 예를 들어, timeout == 1
8.8.8.8에서 포트 440~444를 확인하는 데 약 4초가 걸립니다.
로컬 포트 가용성을 확인하는 것이 왜 그렇게 빠른가요? (중요하다면 우분투를 사용하겠습니다)
나는 이것이 실제로 필요하지 않다는 것을 알고 있습니다. 로컬 포트를 확인할 때 왜 타임아웃 값이 스크립트 실행 시간에 영향을 주지 않는지 궁금합니다. 이 질문은 프로그래밍보다 운영 체제에 관한 것 같아서 여기에 있습니다.
답변1
localhost인 경우 연결 시도가 즉시 거부되므로 제한 시간에 도달하지 않습니다. 원격 호스트의 경우 패킷을 거부하는 대신 삭제만 할 수 있으므로(방화벽 및 호스트 구성에 따라 다름) 시간 초과가 발생합니다.