我正在尝试在端口 8195 上创建一个简单的侦听器。当我在 PHP CLI 条件下尝试以下代码块时,它只显示一次“测试”,然后挂起。如果我删除文件“votifier.run”,该文件设计为开/关开关,它仍然会继续挂起。它从不显示“客户端已连接”。
此外,如果我在脚本运行时尝试通过端口 8195 上的 Telnet 连接到主机,我只会收到一条连接失败消息。就像它正在寻找一种联系,只是不放弃。
// Set the IP and port to listen to
$address = 'localhost';
$port = 8195;
// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port);
// Start listening for connections
socket_listen($sock);
// Loop continuously
while ( file_exists('votifier.run') ) {
echo 'Test';
$client = socket_accept($sock);
if( $client ) {
echo 'Client connected';
// Don't hang on slow connections
socket_set_timeout($client, 5);
// Send them our version
socket_write("VOTIFIER MCWEBLINK\n");
// Read the 256 byte block
$block = socket_read($client, 256);
...
答案: socket_accept() 通常会挂起,直到建立连接。如果进行了连接尝试,脚本将继续,但因为套接字是在 localhost 上创建的,所以它只接受来自localhost 的连接。
解决方法是使用您的外部 IP 而不是“localhost”或“127.0.0.1”。然后你可以 Telnet 到它。