重新打开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错误依然存在。 - 首次绑定端口成功,说明权限没问题,完全找不到问题根源。
补充测试细节
- 当所有套接字的打开/关闭操作都在主线程中完成时,重新绑定能成功。但设置
SO_REUSEADDR为TRUE后,跨线程复用地址/端口依然失败。 - 进一步测试发现:只要在线程中调用过
recvfrom()(未调用任何send()或sendto()),下次尝试重新打开套接字就会再次出现WSAEACCES错误。 - 完全移除UDP线程后,执行
recv()(触发FD_READ事件)后,尝试将新套接字绑定到之前的端口仍会收到WSAEACCES错误。如果数据源没有传输数据,可以无限次关闭并重新绑定该端口,但一旦完成一次recv()操作,后续绑定就会失效。
至今无法理解为何看似合理的操作无法正常工作,求解决思路。
内容的提问来源于stack exchange,提问作者Steve Valliere
相关产品推荐
相关产品推荐

