在我的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
答案 0 :(得分:0)
代码的结构方式,如果您将except: pass
放在顶层,那么当异常发生时,它只会被困在顶层,并且您的代码中没有任何东西可以使它返回到您的listen
.. accept
代码。相反,您应该将异常捕获在代码中的正确位置,以便代码继续外部while True
循环。
通常。最好将所有通常会失败的套接字操作放在try-except块中。但是,在裸露的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()
往往会在代码中隐藏不应隐藏的错误。因此,您通常将执行以下操作:
send
此外,请注意,我将sendall
替换为send
。这样可以确保将整个字符串发送出去。 (使用textureBarrier
,在某些情况下发送的字节数少于整个字符串是有效的。)