Regarding previous post:
"0" has address is no different from "0.0.0.0"
127.0.0.1 -> accept only from local host
w.x.y.z (valid local IP) -> accep only from this network
0.0.0.0 -> accept from anywhere
socket_bind
(PHP 4 >= 4.1.0, PHP 5)
socket_bind — ソケットに名前をバインドする
説明
address で指定した名前を socket で指定したソケットにバインドします。 これは、socket_connect() あるいは socket_listen() を使用して接続が確立される前に行われます。
パラメータ
- socket
-
socket_create() で作成した有効なソケット記述子。
- address
-
ソケットの種類が AF_INET の場合、 address はドットで 4 つに区切られた表記 (例: 127.0.0.1)の IP アドレス。
ソケットの種類が AF_UNIX の場合、 address は Unix ドメインソケット (例: /tmp/my.sock)。
- port(オプション)
-
パラメータ port は AF_INET ソケットにバインドする場合にのみ使用され、 接続するリモートホストのポートを指定します。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
エラーコードは socket_last_error() により取得できます。 このコードを socket_strerror() に渡すことにより、 エラー内容を表すテキストを得ることができます。
例
例1 socket_bind() を使用してソースアドレスを指定する
<?php
// 新しいソケットを作成する
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// コンピュータが所有する IP アドレスリストの例
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';
// ソースアドレスをバインドする
socket_bind($sock, $sourceips['madcoder']);
// 接続先アドレスと接続する
socket_connect($sock, '127.0.0.1', 80);
// 書き込む
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);
// 閉じる
socket_close($sock);
?>
注意
注意:
この関数は、 socket_connect() の前に実行されている必要があります。
注意:
Windows 9x/ME 互換性の注意: マシンに属しないアドレスにソケットをバインドしようとした場合、 socket_last_error() は 無効なエラーコードを返すことがあります。
参考
- socket_connect() - ソケット上の接続を初期化する
- socket_listen() - ソケット上で接続待ち(listen)する
- socket_create() - ソケット(通信時の終端)を作成する
- socket_last_error() - ソケットの直近のエラーを返す
- socket_strerror() - ソケットエラーの内容を文字列として返す
It appears for the $address parameter:
'127.0.0.1'
accepts clients from localhost (eg. 127.0.0.1)
'0.0.0.0'
accepts clients from localhost, and the server's network (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40)
'0' or 0
accepts clients from localhost, the server's network, and external networks (eg. 127.0.0.1, 192.168.2.5, 10.20.30.40, 209.85.169.99)
Use 0 for port to bind a random (free) port for incoming connections:
socket_bind ($socket, $bind_address, 0);
socket_getsockname($socket, $socket_address, $socket_port);
socket_listen($socket);
...
$socket_port contains the assigned port, you might want to send it to a remote client connecting. Tested with php 5.03.
The aforementioned tidbit about using NULL to bind to all addresses did not work for me, as I would receive an error about unknown address. Using a 0 worked for me:
socket_bind ($socket, 0, $port)
This also allows you to receive UDP broadcasts, which is what I had been trying to figure out.
If you want to reuse address and port, and get rid of error: unable to bind, address already in use, you have to use socket_setopt (check actual spelling for this function in you PHP verison) before calling bind:
<?php
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo socket_strerror(socket_last_error($sock));
exit;
}
?>
This solution was found by
Christophe Dirac. Thank you Christophe!
