I use this script to listen on 3 ports, but with 'netstat -a' in other console reports only the last one is 'LISTEN'.
#!/usr/bin/php -q
<?php
$services = array(
56700 => 'daemon1',
56701 => 'daemon2',
56703 => 'daemon3',
);
// --- Marca el Tiempo Ilimitado para pararse ---
set_time_limit (0);
$sockets = array();
foreach($services as $port => $daemon)
{
// --- Abre el socket ---
if ($sock = @socket_create_listen($port))
{
$sockets[$sock] = $daemon;
}
else
{
echo("error\n");
}
}
print_r($sockets);
while (1)
{
echo "";
}
?>
socket_create_listen
(PHP 4 >= 4.1.0, PHP 5)
socket_create_listen — 接続を受けつけるためにポートにソケットをオープンする
説明
resource socket_create_listen
( int $port
[, int $backlog = 128
] )
socket_create_listen() は、 AF_INET 型で すべての ローカルインターフェースの指定したポート上で新規接続を待ち受ける 新規ソケットリソースを作成します。
この関数は、新規接続のみを受け入れるソケットを作成しやすくするためのものです。
パラメータ
- port
-
すべてのインターフェイスで待ち受けるポート。
- backlog
-
backlog パラメータは、 接続の順番待ちのキューをどれだけの長さまで保持するかを定義します。 SOMAXCONN を backlog パラメータに渡します。詳細な情報は socket_listen() を参照ください。
返り値
socket_create_listen() は、 成功した場合に新規ソケットリソースを、エラー時に FALSE を返します。エラーコードは socket_last_error() で取得可能です。このコードを socket_strerror() に渡すと、エラーの詳細が文字列で取得可能です。
注意
注意: 特定のインターフェースのみを listen するソケットを作成したい場合は socket_create()、 socket_bind() および socket_listen() を使用します。
参考
- socket_create() - ソケット(通信時の終端)を作成する
- socket_create_pair() - 区別できないソケットの組を作成し、配列に保存する
- socket_bind() - ソケットに名前をバインドする
- socket_listen() - ソケット上で接続待ち(listen)する
- socket_last_error() - ソケットの直近のエラーを返す
- socket_strerror() - ソケットエラーの内容を文字列として返す
socket_create_listen
vicente dot lopez at caixadesoft dot es
27-Jul-2009 09:29
27-Jul-2009 09:29
aeolianmeson at ifacfchi dot blitzeclipse dot com
26-Jun-2008 10:34
26-Jun-2008 10:34
I believe that on some systems this may not bind to some or all public interfaces.
On my Windows system, I could not connect on the public interface using this, but could when I made the individual calls to create, bind, and listen.
Dustin Oprea
sysspoof at ng-lab dot org
06-Mar-2008 07:03
06-Mar-2008 07:03
Please note that port 1 to and with 1024 on linux and bsd system require root privileges. So it is recommended to choose a higher port for your own application.
jdittmer at ppp0 dot net
17-Jul-2004 11:42
17-Jul-2004 11:42
If you specify no port number, or 0, a random free port will be chosen.
To use ports for ipc between client/server on the same machine you can use (minus error checking)
server.php:
<?php
$sock = socket_create_listen(0);
socket_getsockname($sock, $addr, $port);
print "Server Listening on $addr:$port\n";
$fp = fopen($port_file, 'w');
fwrite($fp, $port);
fclose($fp);
while($c = socket_accept($sock)) {
/* do something useful */
socket_getpeername($c, $raddr, $rport);
print "Received Connection from $raddr:$rport\n";
}
socket_close($sock);
?>
client.php:
<?php
$fp = fopen($port_file, 'r');
$port = fgets($fp, 1024);
fclose($fp);
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, '127.0.0.1', $port);
socket_close($sock);
?>
