python失败后如何关闭套接字?

时间:2014-06-18 08:16:22

标签: python sockets python-2.7

首先,我遇到了Python中的套接字并遇到了这个问题:当我的python代码中出现一些错误时,例如在第二个脚本启动端口上的conn.close()之前的一些语法错误正在使用中。脚本已经完成,但是套接字仍然是打开的,有点像繁忙的套接字。

以下是一个错误:

web@web-X501A1 /var/www $ cd /home/web/www/public/py
web@web-X501A1 ~/www/public/py $ python sockets.py
connected: ('127.0.0.1', 47168)
Traceback (most recent call last):
  File "sockets.py", line 164, in <module>
    data = re.find('(<onvif>.*<\/onvif>)')
AttributeError: 'module' object has no attribute 'find'
web@web-X501A1 ~/www/public/py $ python sockets.py
Traceback (most recent call last):
  File "sockets.py", line 154, in <module>
    sock.bind(('', 9090))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
web@web-X501A1 ~/www/public/py $ python sockets.py
Traceback (most recent call last):
  File "sockets.py", line 154, in <module>
    sock.bind(('', 9090))
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

代码:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

try:
    print 'connected:', addr

    buffer = ''

    while True:
        buffer += conn.recv(1024)
        data = re.find('(<code>.*<\/code>)', buffer)
        print data
        exit();
        if not data:
            continue
        conn.send(data.upper())
except Exception:
    pass
finally:
    conn.close()

3 个答案:

答案 0 :(得分:2)

在try / finally子句中包含套接字的用法。关闭finally部分中的套接字。也许在except部分处理异常。类似的东西:

try:
    result = x / y
except ZeroDivisionError:
    print "division by zero!"
else:
    print "result is", result
finally:
    print "executing finally clause"

答案 1 :(得分:1)

这里的问题是在没有正确的TCP连接关闭序列的情况下脚本崩溃时发生的脏套接字关闭。值得庆幸的是,这是一个简单的解决方案,它告诉内核忽略套接字已被使用的事实(它被绑定的端口):

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

这就是全部,在绑定调用之前添加它并进行设置。一旦完成,调试其他错误会更简单,更省时;)请参阅文档中的更多内容https://docs.python.org/2/library/socket.html#socket.socket.setsockopt

答案 2 :(得分:0)

如果您使用netstat -nutap,您应该会注意到,在名为TIME_WAIT的状态下,您的连接似乎仍然存在。

这是TCP协议的一部分,并且根据wikipedia

  

表示等待足够的时间来确保远程TCP   收到其连接终止请求的确认。   [根据RFC 793,连接可以在TIME-WAIT中保持最大值   四分钟称为MSL(最大段寿命)。]

所以,当你尝试立即重新连接到同一个端口时,python会抱怨这个端口仍然很忙而且无法绑定,说:

socket.error: [Errno 98] Address already in use

请参阅this旧问题,询问如何避免等待时间。