【问题标题】:Python: interrupt s.accept()Python:中断 s.accept()
【发布时间】:2014-07-31 00:37:42
【问题描述】:

我有这个代码:

host, port = sys.argv[1:3]
port=int(port)
s = socket.socket()
s.bind((host,port))
s.listen(5)
while True:
    conn, addr = s.accept()
    threading.Thread(target=handle,args=(conn,)).start()

我需要使用 Ctrl-C 停止我的代码,但 Python 在等待新连接时没有收到 Ctrl-C (s.accept())。我该如何解决这个问题?

【问题讨论】:

  • 你应该看看这个thread。它详细介绍了如何捕获和处理 SIGINT 信号。

标签: python


【解决方案1】:

为了停止socket连接,你可以像这样调用shutdown方法:

s.shutdown(socket.SHUT_WR)

(此 SHUT_WR 停止所有新的写入和读取)

但是,当您的代码运行时,它会在尝试建立 TCP 连接时暂停。为了通过 Ctrl-C 停止它,您需要在另一个线程上运行套接字,让您的主线程能够唤醒中断并发送关闭消息。

【讨论】:

    【解决方案2】:

    您可以根据需要使用shutdown()close()

    下面给出了精彩的解释(来自AIX 4.3 Communications Programming Concepts

    一旦不再需要套接字,调用程序可以通过对套接字描述符应用关闭子例程来丢弃套接字。如果在发生关闭时可靠的传递套接字具有与之关联的数据,则系统会继续尝试数据传输。但是,如果数据仍未交付,系统将丢弃该数据。如果应用程序没有使用任何待处理的数据,它可以在关闭套接字之前使用套接字上的关闭子例程。

    【讨论】:

    • 是的,我从那里找到了它..:) 这就是为什么我把它放在阴影中
    • 感谢链接..;)
    • 不,我不想关闭套接字。在我已经调用 s.accept() 的那一刻,我需要停止按 Ctrl-C 执行 s.accept()
    猜你喜欢
    • 2021-03-18
    • 2011-07-04
    • 2018-01-24
    • 2011-06-25
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多