You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关闭UDP Socket后如何重新开启?

解决UDP Socket关闭后重新开启的问题

嘿,我来帮你搞定这个UDP Socket的问题~

首先得明确一个关键点:当你调用sock.close()之后,这个socket对象就彻底失效了,没法直接“重新开启”它。UDP和TCP在这一点上是一样的——关闭后的socket不能再被复用,你得重新创建一个新的socket实例才行。

为什么你用connect()会报错?

你提到以为connect()是TCP专属的,其实UDP也支持这个方法,但它的作用和TCP完全不同:

  • TCP的connect()是和服务器建立双向连接;
  • UDP的connect()只是帮你绑定一个固定的目标地址,之后用send()发送数据时就不用每次都指定(host, port)了,本质上还是无连接的通信。

你报错的原因是已经关闭的socket对象不能再调用任何方法(包括connect(),因为它已经被系统释放了。

正确的重新使用UDP Socket的步骤

直接上示例代码,一看就懂:

import socket

# 第一次创建并使用UDP Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"Hello UDP", ("127.0.0.1", 8080))
sock.close()  # 关闭旧socket

# 重新开启的正确方式:创建一个新的socket实例
new_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 如果需要固定目标地址,现在可以用connect(注意是新的socket对象)
new_sock.connect(("127.0.0.1", 8080))
new_sock.send(b"Hello again UDP")  # 因为已经connect,所以直接用send
new_sock.close()

额外小提示

如果你需要频繁发送UDP数据,其实可以不用每次都关闭socket——保持socket活跃,重复发送数据就行,只有当你确定不再需要这个socket的时候再调用close()。这样能避免频繁创建销毁socket的开销。

内容的提问来源于stack exchange,提问作者Benke Boldizsár Hargitai

火山引擎 最新活动