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));
我有一个音频流应用程序,它使用绑定到端口 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));