2

我有一个监听套接字的应用程序。此应用程序由 nagios 监控。问题是,nagios 打开套接字并直接关闭它们。我的应用程序套接字停留在 CLOSE_WAIT 中。我不明白为什么会这样。它应该遇到错误并终止套接字。

           while request=="":
                    try:
                            request = self.client.recv ( 1024 ).rstrip()
                    except socket.timeout, msg:
                                    log.error( "no request")
                                    self.client.close()
                                    return
                    except socket.error, msg:
                                    print msg
                                    self.client.close()
                                    return
                    except msg:
                                    log.error(msg)
                                    self.client.close()
                                    return

任何想法如何正确捕捉这个?

4

3 回答 3

3

CLOSE_WAITstate 意味着套接字应该被应用程序关闭。

在您发布的代码中,套接字仅在异常时关闭。确保在收到套接字时关闭套接字,即在剥离之前EOF检查。not request

于 2012-06-28T08:25:08.723 回答
1

当远程端正常关闭连接时,标准 BSDrecv调用返回零。在 Python 中,返回的值被转换为空字符串。在这两种情况下,它都不会被视为错误,因此您不应期待任何异常。

您的代码可以说:

request = self.client.recv(1024).rstrip()
if not request:
  print "Connection closed"
  self.client.close()

您还可以在finally块之后关闭块中的连接try-except以避免代码重复。如果您希望服务器在发送数据后关闭连接,您可以表示如下:

request = ""
r = True
while r:
  r = self.client.recv(1024)
  request += r
于 2012-06-28T22:35:21.263 回答
1

你在使用gevent-websockets图书馆吗?

我们也遇到了这个问题,之前做了一个本地补丁self.stream = None,为我们解决了这个问题。

顺便说一句,调用close()套接字是不够的。来自 python 文档:(https://docs.python.org/2/library/socket.html

注意 close() 释放与连接关联的资源,但不一定立即关闭连接。如果要及时关闭连接,请在 close() 之前调用 shutdown()。

$ diff /usr/lib/python2.7/dist-packages/geventwebsocket/websocket.py.orig /usr/lib/python2.7/dist-packages/geventwebsocket/websocket.py
3c3
< from socket import error
---
> from socket import error, SHUT_RDWR
372a373,379
> 
>             try:
>                 # if we don't close, leaks open files in a CLOSE_WAIT state
>                 self.stream.handler.socket.shutdown(SHUT_RDWR)
>                 self.stream.handler.socket.close()
>             except:
>                 pass

请注意,该方法中有一条注释:

关闭 websocket 和连接,发送指定的代码和消息。底层的套接字对象没有关闭,那是发起者的责任。

所以这是否“正确”是有争议的,但 EOD 它为我们解决了它。

于 2016-06-30T17:52:25.897 回答