试着去对待山姆

2024-03-28 11:17:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一些检查端口是否打开的东西,但是修改它以供我使用

我为检查设置了timeout,如果timeout达到,就会引发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异常上调用它,但我敢打赌python有更聪明的东西

什么能做到这一点


Tags: 端口代码onportchecktimeoutsocketresult
1条回答
网友
1楼 · 发布于 2024-03-28 11:17:28

我觉得你不需要什么聪明或神奇的东西。我查看了您的代码,然后在终端中输入python -c "import this",并在行中看到:

Flat is better than nested.

因此,您不需要在try ... except timeout中创建、设置timeout并关闭套接字—没有任何东西会在那里抛出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()是否是有意义的操作。如果所有的问题都是肯定的,那么你已经有了一个非常优化的结构-至少没有系统的完整视图

相关问题 更多 >