Php 为什么stream_socket_服务器不阻止Windows上其他套接字的端口?

Php 为什么stream_socket_服务器不阻止Windows上其他套接字的端口?,php,windows,sockets,Php,Windows,Sockets,我有一个PHP脚本打开多个端口进行监听。代码归结为尝试打开端口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, $err

我有一个PHP脚本打开多个端口进行监听。代码归结为尝试打开端口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不同的资源。为什么会发生这种情况?是否有可能某个端口已经从同一进程打开了一个套接字,而没有保留套接字上的记录

注:从不同进程打开两个插座失败

相关问题:

更新

请参阅,所描述的行为似乎仅适用于Windows版本的PHP。

请查看以测试端口是否打开

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


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

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

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

通常,在创建服务器时,您希望有一个已知端口,以便多个客户端可以连接到它,就像http的端口80一样。服务器使用“侦听”来侦听连接,然后是“接受”,最后是“关闭”。accept确保您可以通过服务器端口获得多个连接

顺便说一句:

通过打开端口0上的套接字,可以找到可用端口。 您可以通过“选择”处理多个套接字 一本关于套接字的好书是Jesse Storimer写的《使用Tcp套接字》,仅供参考我没有库存,只有这本书;。但是如果你的google fu与你在一起,有很多关于socket编程的介绍。
你在运行什么版本的PHP?当我在PHP5.5.9上运行你的代码时,我得到类型为stream PHP的:resource5警告:stream\u socket\u服务器:无法连接到tcp://127.0.0.1:7777 第3行boolfalse上的/home/hq6/Code/SO/PHP/SSB.PHP中已在使用的地址嗯。这听起来像是一个平台问题-在Windows上,我得到了resource5和Resource6.1相同的进程,没有使用,因为我只想找到一个具有不同进程的免费socket2。第二个socketWell上的脚本错误,第二个调用生成一个ressource,所以我不确定这会有什么帮助?我想,与其尝试创建一个服务器套接字来验证端口是否正在使用,不如使用该代码。我已经测试过了,它确认在你的一行代码之后,插座是打开的。请重新阅读这个问题。在创建s2时,我没有s1变量可用于该测试。您不需要它。我链接的代码允许您测试特定端口是否打开。从这个意义上讲,您可以测试端口7777,如果打开,则创建服务器,如果不测试7778等等。这种混淆源于这样一个事实:Windows上的PHP似乎只允许为同一端口打开多个服务器套接字。