Python: 中断 s.accept()

1 投票
2 回答
1720 浏览
提问于 2025-04-18 15:22

我有这段代码:

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 在等待新连接时(s.accept()),它并没有接收到 Ctrl-C 的信号。我该怎么解决这个问题呢?

2 个回答

0

你可以使用 shutdown()close() 来满足你的需求。

下面是一个很好的解释(来自 AIX 4.3 通信编程概念

当一个套接字不再需要时,调用程序可以通过对套接字描述符使用关闭子程序来丢弃这个套接字。如果一个可靠传输的套接字在关闭时还有数据与之关联,系统会继续尝试传输这些数据。不过,如果这些数据仍然没有送达,系统就会丢弃这些数据。如果应用程序不需要任何待处理的数据,它可以在关闭套接字之前先对套接字使用 shutdown 子程序。

1

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

s.shutdown(socket.SHUT_WR)

(这个 SHUT_WR 会停止所有新的写入和读取操作)

不过,当你的代码在运行时,如果它正在尝试建立 TCP 连接,就会被暂停。这时候,如果你想通过 Ctrl-C 来停止它,你需要在另一个线程中运行套接字,这样主线程才能醒来响应中断,并发送关闭的指令。

撰写回答