【问题标题】:How to shutdown udp socket in python如何在python中关闭udp套接字
【发布时间】:2018-04-29 16:17:14
【问题描述】:

我有一个套接字侦听器线程正在运行,它应该在满足特定条件时关闭。这是我的代码 sn-p。

 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)?
  • @KlausD。是的 kill 函数有自我,这是一个拼写错误

标签: python python-3.x sockets udp


【解决方案1】:
self.socket.shutdown(socket.SOCK_DGRAM)

shutdown 与 UDP 套接字无关,但与 TCP 相关。而且,shutdown 只接受关于如何关闭的参数(SHUT_RDSHUT_WRSHUT_RDWR),而不像你那样接受协议。

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

【讨论】:

  • 那么我如何通知一个线程轮询 UDP 套接字以获取套接字已关闭的新数据包?关闭对于 TCP 套接字非常有效。
  • @AlexGrönholm:我假设您想通知某个远程应用程序不会在此连接上发送更多数据。使用 TCP,您可以关闭套接字,这会导致涉及发送 FIN 的连接断开,以便对等方知道套接字已关闭。 UDP没有这样的概念,甚至没有与UDP真正连接的概念。如果您需要明确通知对等方您已完成,您需要使用此类消息定义应用程序协议并使用它。有关此问题的更多信息,请创建一个新问题,不要在评论中提问。
  • 我的问题是关于在 另一个线程 正在关闭套接字时通知读者,但根据我的研究,这在套接字级别是不可能做到的,并且需要一些软件框架级别机制。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
相关资源
最近更新 更多