【问题标题】:Why doesn't stream_socket_server block the port from additional sockets on Windows?为什么 stream_socket_server 不阻止 Windows 上其他套接字的端口?
【发布时间】:2016-07-02 08:29:06
【问题描述】:

我有一个 reactphp 脚本打开多个端口进行监听。代码归结为尝试在端口 x 上打开一个套接字,如果被占用,则选择端口 +1。

我发现我可以为同一个端口打开多个套接字而不会出现错误消息,这使得上述查找“空闲”端口的方法无效:

var_dump($s1 = stream_socket_server("tcp://127.0.0.1:7777", $errno, $errstr));
var_dump($s2 = stream_socket_server("tcp://127.0.0.1:7777", $errno, $errstr));

两个调用都返回具有不同 ID 的资源。为什么会发生这种情况?端口是否可能已经有来自同一个进程的打开套接字(没有在套接字上保存 book)?

PS.:从不同进程打开两个套接字按预期失败。

相关问题:Multiple UDP Sockets to listen for specific source on the same port

更新

请参阅https://3v4l.org/6eWY1,似乎所描述的行为仅适用于 Windows 版本的 PHP。

【问题讨论】:

  • 你运行的是什么版本的 PHP?
  • 当我在 PHP 5.5.9 上运行您的代码时,我得到:resource(5) of type (stream) PHP Warning: stream_socket_server(): unable to connect to tcp://127.0.0.1:7777 (Address already in use) in /home/hq6/Code/SO/PHP/SSB.php on line 3 bool(false)
  • 嗯。那么这听起来像是一个平台问题——在 Windows 上我得到了资源(5)和资源(6)。
  • 1) 相同的进程,没有使用,因为我只想找到一个空闲的套接字
  • 2) 使用不同的进程,第二个套接字上的脚本错误

标签: php windows sockets


【解决方案1】:

查看this technique 以测试端口是否打开。

我使用您的代码得到了相同的结果,并且这种技术可以帮助我识别端口是否已被同一进程打开。

如果您不介意开销,这可能是一个选择。

【讨论】:

  • 嗯,第二次调用产生了一个资源,所以不确定这会有什么帮助?
  • 好吧,我想您可以使用该代码,而不是尝试创建服务器套接字来验证端口是否正在使用。我已经对其进行了测试,它确认在您的代码行之一之后套接字是打开的
  • 请重新阅读问题。创建 s2 时,我没有可用于该测试的 s1 变量。
  • 你不需要它。我链接的代码允许您测试特定端口是否打开。从这个意义上说,您可以测试端口 7777,如果打开,则创建服务器,如果没有,则测试 7778 等等。
【解决方案2】:

仅供参考,我不懂 PHP,我主要使用 Linux,所以你的里程可能会有所不同。看来我可以帮助你一些 tcp 知识。如果您已经知道这一点,请原谅我并忽略我的回答;)

所以我不知道您如何连接到服务器套接字以及服务器如何处理连接,但如果编程正确,您的服务器将不会占用端口,从而阻止未来的连接。如果您愿意,您当然可以这样做。

通常,当您创建服务器时,您希望拥有 1 个已知端口,以便多个客户端可以连接到它(例如 http 的端口 80)。服务器使用“listen”来监听连接,然后是“accept”,最后是“close”。接受确保您可以通过服务器端口获得多个连接。

顺便说一句:

  • 您可以通过在端口 0 上打开一个套接字来找到一个空闲端口。
  • 您可以通过“选择”处理多个套接字
  • 一本关于套接字的好书是 Jesse Storimer 的《使用 Tcp 套接字》(仅供参考,我没有库存,只有书;)。但是,如果您的 google fu 与您同在,则有很多关于套接字编程的介绍。

【讨论】:

  • 我知道一个服务器套接字可以处理多个客户端。混淆来自这样一个事实,即 PHP(似乎仅在 Windows 上)允许为同一个端口打开多个服务器套接字。
猜你喜欢
  • 2019-05-31
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2015-02-03
  • 2019-04-23
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多