【问题标题】:python - should I dispose a socket after sending udp data?python - 我应该在发送 udp 数据后处理一个套接字吗?
【发布时间】:2017-01-11 14:26:46
【问题描述】:

我有一个监听事件的方法,每次事件发生时,它都应该将数据发送到一个套接字(它的 udp,所以我不检查是否接收到数据)。

我在 event_handler 中的内容是这样的:

    socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    socket.sendto(data, (IP, PORT))

在我看来,我需要创建一个新的套接字每次事件被调用,因为我不知道两个事件之间会经过多少时间,所以有一个 global套接字变量并在事件不保证套接字仍处于启动状态时发送数据。

问题是,因为我每次都创建套接字,我应该在发送数据后处理/关闭它吗?使用后处理或关闭套接字的最佳方法是什么?

【问题讨论】:

  • “socket 仍在运行”是什么意思?套接字,afaik,没有“向上”或“向下”状态。

标签: python sockets network-programming udp python-sockets


【解决方案1】:

正如 Rob 已经解释的那样,您不必每次都创建一个新的套接字。

根据文档 (https://docs.python.org/3/library/socket.html):

套接字在被垃圾回收时会自动关闭,但是 建议明确地 close() 它们,或使用 with 围绕他们的声明。

因此,如果您选择每次都创建/关闭,您可以这样做:

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as socket:
    socket.sendto(data, (IP, PORT))

【讨论】:

    【解决方案2】:

    在我看来,每次调用事件时我都需要创建一个新的套接字,

    不,可以重复使用以前的套接字。请记住 UDP 套接字是无连接的,因此您对断开连接的担忧并不适用。

    问题是,因为我每次都创建套接字,我应该在发送数据后处理/关闭它吗?

    是的,如果您要创建无数个套接字,请随时关闭它们。否则,您将用完文件描述符插槽,这是您进程中的有限资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多