You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重新打开UDP套接字时为何出现WSAEACCES错误?

UDP套接字关闭后重新绑定相同端口时出现WSAEACCES错误

我的程序需要实现:关闭UDP套接字后重新打开,始终使用相同端口和INADDR_ANY接收数据。但尝试重新打开时,即便已经启用SO_REUSEADDR,bind()调用仍一直返回WSAEACCES错误。

套接字初始化代码摘要

SOCKET      sock;
SOCKADDR_IN sin;
BOOL        bTrue;
DWORD       dwTrue;
sock = socket( AF_INET, SOCK_DGRAM, 0 );
if( INVALID_SOCKET == sock ){/*错误处理*/}
bTrue = TRUE;
if( SOCKET_ERROR == setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, (char *)&bTrue, sizeof(bTrue) ) ){/*错误处理*/}
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port        = htons(18889);
sin.sin_family      = AF_INET;
if( SOCKET_ERROR == bind( sock, (SOCKADDR*)&sin, sizeof(sin) ) ){/*错误处理*/}
dwTrue = TRUE;
ioctlsocket( sock, FIONBIO, &dwTrue );

场景细节

  • 套接字的创建与销毁都由线程完成:线程终止前会调用closesocket()关闭套接字,重新打开的操作在新的线程实例中执行。
  • 用管理员权限运行netstat后,确认套接字关闭后没有任何进程占用该UDP端口,但WSAEACCES错误依然存在。
  • 首次绑定端口成功,说明权限没问题,完全找不到问题根源。

补充测试细节

  1. 当所有套接字的打开/关闭操作都在主线程中完成时,重新绑定能成功。但设置SO_REUSEADDR为TRUE后,跨线程复用地址/端口依然失败。
  2. 进一步测试发现:只要在线程中调用过recvfrom()(未调用任何send()或sendto()),下次尝试重新打开套接字就会再次出现WSAEACCES错误。
  3. 完全移除UDP线程后,执行recv()(触发FD_READ事件)后,尝试将新套接字绑定到之前的端口仍会收到WSAEACCES错误。如果数据源没有传输数据,可以无限次关闭并重新绑定该端口,但一旦完成一次recv()操作,后续绑定就会失效。

至今无法理解为何看似合理的操作无法正常工作,求解决思路。

内容的提问来源于stack exchange,提问作者Steve Valliere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:49:56