重新绑定 UDP 套接字

Posted

技术标签:

【中文标题】重新绑定 UDP 套接字【英文标题】:Re-Bind UDP socket 【发布时间】:2012-11-09 05:58:17 【问题描述】:

我制作了一个使用 udp 发送消息的程序。该程序最初将使用默认 IP 地址和端口初始化 udp 套接字。但是,它还应该允许用户在运行时更改目标 IP 地址和端口。

目前,如果用户更改IP地址/端口,我会关闭当前套接字,并使用新的IP地址/端口重新初始化/绑定套接字。

程序能够使用初始套接字成功发送消息。但是当我重新绑定 ip 地址/端口时,绑定有时会失败。 Bind() 返回值 -1。我在网上做了一些搜索,发现当套接字关闭时 TCP 协议有 2msl 超时。这适用于 UDP 吗?

另外,是否有更好的方法允许用户更改目标 IP/端口。顺便说一句,我在 Visual Studio 上使用 C++。

谢谢。

【问题讨论】:

bind()失败时,WSAGetLastError()的返回值是多少? 【参考方案1】:

2MSI 超时不适用于 UDP。但是,另一个应用程序可能正在使用您尝试绑定到的 ip/port。如果您知道 ip/port 可以安全使用,则可以在调用 bind() 之前使用 setsockopt() 启用套接字的 SO_REUSEADDR 选项。

【讨论】:

抱歉,由于我正在处理一个机密项目,因此无法在此处复制和粘贴我的代码。项目在没有互联网访问的 com 上完成,并且不允许在 PC 之间传输数据。 WSAGetLastError 在调用 Bind() 时返回值 10022。尝试使用 SO_REUSEADDR。问题依然存在。 10022 是WSAEINVAL,如果套接字已经绑定到一个地址,bind() 返回。一个套接字只能绑定一次。

以上是关于重新绑定 UDP 套接字的主要内容,如果未能解决你的问题,请参考以下文章

绑定多播 (UDP) 套接字是啥意思?

udp 套接字发送到隐式绑定

Linux中的双UDP套接字绑定

使用 C 绑定到 IOCP 的 UDP 套接字

在 Ruby 中将 UDP 套接字绑定到通配符主机

在 node.js 中,如何创建一个自动绑定到可用端口的 UDP 套接字?