UDP 套接字仍然绑定到以前的端口——如何重用它?

UDP socket still bound to previous port – how to reuse it?

我有一个音频流应用程序,它使用绑定到端口 50050 的 Boost UDP 套接字。我目前遇到一个问题,当应用程序在流式传输时关闭。重新启动应用程序时,它无法再绑定到端口 50050。 我做了一个“netstat -p UDP”,它显示了以下内容

Proto Recv-Q Send-Q Local Address Foreign Address (state)

udp4 1026 0 *.50050 .

所以,基本上这个套接字的接收队列不为空,之前绑定的端口确实还在。

现在我想知道是否 a) 有办法强制绑定到端口 50050 或 b) 可以清除套接字接收队列或 c) 可以重用现有套接字或 d) 如果您有其他建议如何解决问题 ?

提前致谢, 最佳

亚历克斯

与 TCP 不同,UDP 套接字不会在套接字被应用程序关闭后以某种临时状态徘徊。因此,您所看到的意味着仍然有一个进程拥有绑定到该端口的套接字。这表明该应用程序没有完全关闭,但至少有一个线程仍然 运行。或者它可能是一个继承套接字的分叉子。

虽然您可以使用 SO_REUSEADDR 创建一个额外的套接字(有关详细信息,请参阅其他评论和答案),但这不会使已经存在的套接字处于非活动状态。发送到此端口的数据将仅在现有套接字之一结束,不会传播到所有套接字。这可能会导致数据丢失。

在调用 bind 之前在套接字上设置 SO_REUSEADDR 属性。

int fAllow = 1;
int result;


result = ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &fAllow, sizeof(fAllow));