【问题标题】:Socket connection won't close?套接字连接不会关闭?
【发布时间】:2013-12-12 01:48:22
【问题描述】:

我正在尝试编写一个简单的服务器程序来打印发送给它的数据,或者如果数据是“退出”、“退出”或“停止”则退出:

HOST = ""
PORT = 37720

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(1)

while(1):
    conn, addr = server.accept()

    data = conn.recv(1024)
    if not data: break

    inData, inUrl = json.loads(data)

    if inData == "quit" or inData == "exit" or inData == "stop":
        print("Quitting")
        conn.close()
        break
    else:
        conn.send("Received")
        print(inData)

它符合我的预期,除了当我在服务器退出后再次尝试运行服务器时,我得到:

Traceback (most recent call last):
  File "./s", line 14, in <module>
    server.bind((HOST, PORT))
  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

我认为这意味着连接没有关闭。我怎样才能关闭它以防止这种情况发生?我尝试了conn.close(),但没有解决任何问题。

【问题讨论】:

  • 附带说明一下,您的代码确实真正起作用。 Sockets are byte streams, not message streams。没有理由相信您从conn.recv 返回的每个缓冲区都是一条消息;它可以是半条消息,也可以是六个单独的消息。它可以在 localhost 上进行简单的测试,但是当你真正部署它时,90% 的时间会失败(或者更糟糕的是,失败 1% 的时间,这足以让它变得无用但不足以调试它)。跨度>

标签: python sockets


【解决方案1】:

您需要设置 SO_REUSEADDR 标志。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多