如何正确处理套接字异常

时间:2018-08-24 01:46:29

标签: python sockets

在我的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

1 个答案:

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