Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 温索克:与苏博士的奇怪冲突_Windows_Sockets_Tcp_Winsock - Fatal编程技术网

Windows 温索克:与苏博士的奇怪冲突

Windows 温索克:与苏博士的奇怪冲突,windows,sockets,tcp,winsock,Windows,Sockets,Tcp,Winsock,我面临着一种奇怪的行为 “当两个套接字绑定到相同的端口号但在不同的显式接口上时,不存在冲突”为什么在步骤3的下列情况下,系统出现故障?这是操作系统中的一个bug吗?(我在上的帖子没有答案) 是否有一些解决方法 第一步。进程A绑定127.0.1.1:88(默认)-确定 第二步。进程B绑定127.0.0.1:88(使用SO_REUSEADDR)-确定 第三步。进程C绑定127.0.0.1:88(带SO_REUSEADDR)-失败(10013 WSAEACCES) 注意:tcp端口相同,接口不同且

我面临着一种奇怪的行为

“当两个套接字绑定到相同的端口号但在不同的显式接口上时,不存在冲突”为什么在步骤3的下列情况下,系统出现故障?这是操作系统中的一个bug吗?(我在上的帖子没有答案) 是否有一些解决方法

  • 第一步。进程A绑定127.0.1.1:88(默认)-确定
  • 第二步。进程B绑定127.0.0.1:88(使用SO_REUSEADDR)-确定
  • 第三步。进程C绑定127.0.0.1:88(带SO_REUSEADDR)-失败(10013 WSAEACCES)
注意:tcp端口相同,接口不同且明确(在步骤1和2-3之间)。用户是相同的

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

在Windows XP中,这一切正常:步骤3成功


更新:仅供参考,同样的问题是:

当两个套接字都使用
时,将两个套接字绑定到同一显式接口和端口,因此即使是最新版本也保证成功。这一定是代码中的一个错误,要么在调用
bind()
之前没有在两个套接字上启用
SO\u REUSEADDR
,要么实际上没有将两个套接字绑定到同一显式接口和端口


bind()
如果接口/端口已在使用,则不会返回
WSAEACCES
。它返回
WSAEADDRINUSE
WSAEACCES
表示您试图绑定到您无权绑定的对象。这是另一种错误情况。

您必须在所有三个绑定上使用SO\u REUSEADDR。然而,当两个套接字使用相同的显式接口和端口时,将两个套接字绑定到同一个显式接口和端口,从而保证REUSEADDR不确定地工作。你为什么要这样做?根据文档,这个案例应该可以成功运作(第一步没有SO_REUSEADDR)。我为什么要这样做?我在后端有一个web应用程序,在前端有Nginx。此web应用程序在127.x.x.x:80上侦听,Nginx在public:80上侦听。Nginx在重新加载配置方面遇到问题。解决方法:在后端使用另一个端口;但是在HTTP everywhere.FWIW上使用端口80很方便,该链接上的许多信息都是不正确的(不幸的是,许多MSDN文档似乎都是这样),所以它不能被认为是一本可靠的手册。这台机器真的有IPs 127.0.1.1和127.0.0.1的接口吗?同样的代码在Windows XP中工作,在Windows Vista中失败;我在代码中找不到bug。你能自己试一试这个实验吗?我可以在64位Windows 7上复制
WSAEACCES
。问题在于A的绑定。当我移除它时,绑定B和C会如预期的那样成功。微软的文档说,只有当A在与B和C不同的用户帐户下运行时,才会发生这种情况。但我可以让
WSAEACCES
在同一帐户(甚至是同一进程)下发生,这与文档相矛盾
SO_ExclusiveAdruse
未在任何套接字上使用,并且未使用任何通配符地址。根据文档,如果A与B/C位于不同的用户帐户中,“增强的套接字安全性”将在Windows 2003+上发挥作用,因此A必须同时启用
SO_ReuseAdr
,否则B/C将失败。但是当使用同一个用户帐户时,ESS不应该起作用,但显然它起作用了。如果我启用了一个enable
,那么B和C都会成功,但是如果A没有成功,那么B会成功(但在ESS下应该失败),但C总是失败。谢谢您的确认。我认为A可能无法启用SO_REUSEADDR,因为接口不同。顺便问一下,如果C失败了,为什么B一开始没有失败(我的意思是,如果A和B/C之间发生冲突)?我不知道为什么B成功了,但C失败了。它也不知道为什么当A、B和C都在同一个用户帐户(甚至是同一个进程)中时,A甚至会成为一个因素,但事实确实如此。当微软在Vista中重新编写WinSock堆栈时,一定是把事情搞砸了,但这并不是套接字的常见用法,所以大多数人可能从未注意到。