Winsock:与SO_REUSEADDR的奇怪冲突

时间:2012-06-27 18:20:17

标签: windows sockets tcp winsock

我遇到了一种奇怪的行为。

manual claimed:“当两个套接字绑定到相同的端口号但在不同的显式接口上时,没有冲突”。 为什么在步骤3中,系统在以下情况下失败?这是操作系统中的错误吗? (我在Microsoft forums上的帖子没有答案) 有一些解决方法吗?

  • 步骤1.进程A绑定127.0.1.1:88(默认) - 确定
  • 步骤2.进程B绑定127.0.0.1:88(使用SO_REUSEADDR) - 确定
  • 步骤3.进程C绑定127.0.0.1:88(使用SO_REUSEADDR) - 失败(10013 WSAEACCES)

注意:tcp-ports是相同的,接口是不同的和显式(在步骤1和2-3之间)。用户是一样的。

问题出现在Windows Vista(32位),Windows Server 2008(32位),Window Server 2008 R2(64位)等中。

在Windows XP中没问题:第3步成功。

更新:仅供参考,同样的问题:Windows 7 socket bind behavior difference from XP, with reuse address socket option (WSAEACCES 10013 error)

1 个答案:

答案 0 :(得分:3)

当两个套接字使用SO_REUSEADDR时,将两个套接字绑定到同一个显式接口和端口,保证会成功,即使Microsoft documentation这样说也是如此。它必须是代码中的错误,要么在调用SO_REUSEADDR之前未在两个套接字上启用bind(),要么实际上并未将两个套接字绑定到同一显式接口和端口。

如果接口/端口已在使用中,则

bind()不会返回WSAEACCES。它返回WSAEADDRINUSEWSAEACCES表示您尝试绑定到您无权绑定的内容。这是一种不同的错误条件。