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 — Passa um nome para o socket
Descrição
$socket
, string $address
[, int $port
] )Esta função é EXPERIMENTAL. O comportamento desta função, seu nome, incluindo toda documentação pode ser modificado sem aviso em futuras versões do PHP. Esta função deve ser usada por sua própria conta e risco.
socket_bind() passa o nome dado em
address para o socket descrito por
socket, que deve ser um resource socket válido
criado com socket_create().
O parâmetro address é qualquer endereço IP
na notação "dotted-quad" (ex. 127.0.0.1), se o socket é da família AF_INET; ou o pathname de um
Unix-domain socket, se o socket é da família
AF_UNIX.
O parâmetro port é somente usado quando
estiver conectando com um socket AF_INET, e
determina a porta no host remoto para o qual a conexão deve ser feita.
Retorna TRUE em caso de sucesso ou FALSE em caso de falha. O código de erro pode ser retornado com
socket_last_error(). Esse código deve ser passado para
socket_strerror() para pegar uma explicação textual do
erro. Note que socket_last_error() é reportado para
retornar um código de erro inválido no caso de você estar tentando passar um socket
para um endereço errado que não pertence à sua máquina Windows 9x/ME.
Veja também socket_connect(), socket_listen(), socket_create(), socket_last_error() e 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)
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!
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.
