2017-12-07 1 views
1

포트가 열려 있는지 확인하지만 내 용도대로 수정하는 내용을 작성 중입니다.try 시도 및 동일 제외

나는 확인을 위해 시간 제한을 설정하고 제한 시간에 도달하면 그것은 socket.timeout 예외가 발생,하지만 난 try 내부의 코드 블록도 socket.timeout에 호출 할 :

try: 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.settimeout(5) 
    result = sock.connect_ex((check_server_ip, check_port)) 
    if result == 0: 
     # act on open port 
    else: 
     # act on closed port 
    sock.close() 
except socket.timeout: 
    # act on closed port 

내가 # act on closed port에있는 코드 블록이다 긴. 코드가있는 함수를 만들고 else 문과 socket.timeout 예외를 호출 할 수는 있지만 파이썬에는 더 영리한 것이있을 것입니다.

무엇을 할 수 있습니까?

+1

'finally :'를 찾고 계십니까? – tripleee

+0

@ tripleee 왜냐하면'if result == 0'을 호출하기를 원하지 않기 때문에'finally'가 항상 호출되기 때문입니다. – Moshe

+1

'여부 = 참; 시도 : 사물; 결과 == 0 : 여부 = 거짓; 기타; 마지막으로 : 만약에 : "닫힌 소켓으로 일을 할 것인가? – tripleee

답변

0

나는 여기에 뭔가 영리하거나 마법이 필요하다고 생각하지 않습니다. 귀하의 코드를 살펴본 다음 내 터미널에 python -c "import this"을 입력하고 행 중에서 이것을 보았습니다.

평면이 중첩 된 것보다 낫습니다.

그래서, 당신은, 설정 시간 초과를 작성하고 try ... except timeout에 소켓을 닫을 필요가 없습니다 - 아무것도 타임 아웃이 발생합니다 :

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.settimeout(5) 

try: 
    result = sock.connect_ex((check_server_ip, check_port)) 
    socket_connected = result == 0 
except socket.timeout: 
    socket_connected = False 

if socket_connected: 
    do_connected_stuff() 
else: 
    do_disconnected_stuff() 

sock.close() 

그러나,이 코드의 정확성이 정말로 do_connected_stuff()을 경우에 따라 달라집니다 이 경우 socket.timeout을 던질 수 있으며 do_disconnected_stuff()이 의미있는 동작 인 경우 모든 질문에 '예'라고 답한 경우, 시스템을 완전히 파악하지 않고도 거의 최적의 구조를 갖추게됩니다.