重新绑定 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 套接字的主要内容,如果未能解决你的问题,请参考以下文章