如何正确处理套接字异常



在我的 Python 程序中,我有一个侦听传入连接的套接字,当我在其上运行nmap时,它会在扫描端口时重置连接时突然关闭。

我尝试在代码末尾放置一个except: pass块,以及以下内容:

if __name__ == "__main__":
try:
listen()
except KeyboardInterrupt:
pass

但是在收到连接重置后,它不会通过。它只是关闭程序而不打印任何内容。 我该如何解决这个问题? 服务器端代码负责接收信息,旁边负责处理信息。我应该在while块之后放一些东西,还是只是一个except

connection.listen(10)
while True:
current_connection, address = connection.accept()
current_connection.send('Input:')
while True:
data = current_connection.recv(2048)

错误:

Traceback (most recent call last):
File "server.py", line 41, in <module>
listen()
File "server.py", line 12, in listen
current_connection.send('Input:')
socket.error: [Errno 104] Connection reset by peer

你的代码的结构方式,如果你把一个except: pass放在顶层,那么当异常发生时,它只被困在顶层,你的代码中没有任何内容导致它回到你的listen..accept代码。相反,您应该将异常捕获在代码中的正确位置,以便代码继续外部while True循环。

一般来说。 最好将所有通常可能失败的套接字操作放在 try-except 块中。不过,在python中有一个裸露的except被认为是不好的做法 - 因为裸except倾向于隐藏代码中不应该隐藏的错误。因此,您通常会执行以下操作:

connection.listen(10)
while True:
current_connection, address = connection.accept()
try:
current_connection.sendall('Input:')
while True:
data = current_connection.recv(2048)
if data == '':
break          # End of file (peer socket was closed)
except socket.error as sockerr:
print("Socket exception on send/recv", sockerr)
current_connection.close()

另外,请注意,我用sendall替换了send。这可确保发送整个字符串。 (使用send,在某些情况下,发送的字节数少于整个字符串是有效的。

相关内容

最新更新