在我的 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
,在某些情况下,发送的字节数少于整个字符串是有效的。