ポート8195で単純なリスナーを作成しようとしています。PHPCLI条件で次のコードブロックを試してみると、「Test」が1回だけ表示され、その後ハングします。オン/オフスイッチとして設計されたファイル「votifier.run」を削除しても、引き続きハングします。「クライアントが接続されています」と表示されることはありません。
さらに、スクリプトの実行中にポート8195でTelnet経由でホストに接続しようとすると、接続に失敗したというメッセージが表示されます。それは、1つの接続を探していて、あきらめないようなものです。
// 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」または「127.0.0.1」ではなく外部IPを使用することです。次に、Telnetで接続できます。