2

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

手册声称:“当两个套接字绑定到相同的端口号但在不同的显式接口上时,不存在冲突”。为什么系统在步骤 3 的以下情况下会失败?它是操作系统中的错误吗?(我在微软论坛上的帖子没有答案) 什么解决方法吗?

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

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

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

在 Windows XP 中没关系:步骤 3 成功。

更新:仅供参考,同样的问题:Windows 7 套接字绑定行为与 XP 不同,带有重用地址套接字选项(WSAEACCES 10013 错误)

4

1 回答 1

3

当两个套接字都使用时,将两个套接字绑定到相同的显式接口和端口SO_REUSEADDR可以保证成功,即使Microsoft 文档也这么说。它必须是您的代码中的一个错误,或者您没有SO_REUSEADDR在调用之前启用两个套接字bind(),或者您实际上没有将两个套接字绑定到相同的显式接口和端口。

bind()WSAEACCES如果接口/端口已在使用中,则不会返回。它WSAEADDRINUSE反而返回。 WSAEACCES表示您试图绑定到您无权绑定的东西。那是一种不同的错误情况。

于 2012-06-27T23:31:44.417 回答