如何在Python中关闭UDP套接字

3
我正在运行一个socket监听线程,当满足特定条件时它应该关闭。以下是我的代码片段。
 def __init__(self, arg):

        threading.Thread.__init__(self)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        receiver_port = int(<port>)
        listen_addr = (<some ip>, receiver_port)
        self.socket.bind(listen_addr)
        self.shutdown = threading.Event()
        self.shutdown.set()

 def kill_function():

       self.socket.shutdown(socket.SOCK_DGRAM)
       self.shutdown.clear()
       self.socket.close()

我正在面临

OSError: [Errno 107] Transport endpoint is not connected error when I try to 
kill the socket.

如果我使用SHUT_RD,SHUT_RDWR也会遇到同样的问题。 请问有人可以帮忙解决如何在使用UDP套接字时调用shutdown()函数吗? 谢谢。

那么,您在同一级别上有一个方法(__init__)和一个函数(kill_function,没有 self)? - Klaus D.
@KlausD,是的,kill函数有self参数,这是一个打字错误。 - anonymus_lte
1个回答

1
self.socket.shutdown(socket.SOCK_DGRAM)

shutdown 对于 UDP 套接字不相关,而对于 TCP 套接字才有意义。并且,shutdown 只接受如何关闭套接字的参数 (SHUT_RD, SHUT_WR, SHUT_RDWR),而不是像你所做的那样指定协议。

除此之外,你的代码将 UDP 套接字绑定到本地地址,但没有将其连接到另一个地址,也就是说,它可以使用 socket.sendto 发送消息到任何地方。因此,在尝试关闭不存在的连接时会收到套接字未连接的消息。


那么,我如何向轮询UDP套接字以获取新数据包的线程发出信号,告知该套接字已关闭?对于TCP套接字,关闭操作很有效。 - Alex Grönholm
@AlexGrönholm:我假设您想通知某个远程应用程序不会再在此连接上发送数据。使用TCP,您可以关闭套接字,这将导致连接的拆除,其中包括发送FIN以使对等方知道套接字已关闭。使用UDP没有这样的概念,甚至没有真正的连接概念。如果您需要明确地通知对等方您已完成操作,则需要定义一个带有此类消息的应用程序协议并使用它。有关更多信息,请创建一个新问题,不要在评论中提问。 - Steffen Ullrich
我的问题是关于当另一个线程关闭套接字时通知读取器,但根据我的研究,在套接字级别上无法实现这一点,需要一些软件框架级别的机制。 - Alex Grönholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接