【问题标题】:Python3: how can we close netlink socket blocking recv?Python3:我们如何关闭netlink socket阻塞recv?
【发布时间】:2021-01-08 13:35:50
【问题描述】:

我有如下 Python 中的原始套接字来接收来自 linux 内核的 netlink 消息。

socket.socket(socket.AF_NETLINK, socket.SOCK_RAW, socket.NETLINK_ROUTE)

我正在这个套接字上阻塞recv,并希望从另一个 Python 线程中关闭它。但是,在此套接字上调用 shutdown(socket.SHUT_RD) 会返回错误 ([Errno95] Operation not supported)

这是为什么呢?我们如何关闭这个套接字?我正在使用 Python 3.7

中没有提到这种行为 https://docs.python.org/3/library/socket.html#socket

如下:

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

【问题讨论】:

    标签: python sockets netlink


    【解决方案1】:

    如果要及时关闭连接,请在close()之前调用shutdown()

    此声明是关于 已连接 套接字的。 TCP 套接字已连接,但 UDP、Raw、Netlink 套接字等未连接。这就是为什么此类套接字不支持 shutdown 的原因。请改用简单的close

    【讨论】:

    • 感谢您的解释!我真正想做的是解除对recv() 的阻塞,这样我就可以关闭recv() 正在运行的线程。调用close() 似乎并没有解除对recv() 的阻止。这是预期的吗?
    • @leopoodle:基于像this one 这样的“在互联网上找到的东西”,看起来一个线程中的close 可能不会唤醒另一个线程中的recv。结合selectpoll 更好地使用非阻塞套接字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多