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
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_bind — Verknüpft einen Socket mit einem Namen
socket_bind() verknüpft den Namen, der in
address
angegeben ist, mit dem Socket
socket
. Dies muss geschehen, bevor eine Verbindung
mittels socket_connect() oder
socket_listen()aufgebaut wird.
socket
Eine Socket-Instanz, die mit socket_create() erzeugt wurde.
address
Falls der Socket zur AF_INET
-Familie gehört,
ist der Parameter address
eine IP in
Punktnotation (z.B. 127.0.0.1
)
Falls der Socket zur AF_UNIX
-Familie gehört,
ist der Parameter address
der Pfad eines
Unix-Domain Sockets (z.B. /tmp/my.sock).
port
(ojptional)
Der Parameter port
wird nur benutzt, wenn an
einen Socket der AF_INET
-Familie gebunden wird und
gibt den Port an, an dem auf Verbindungen gelauscht wird.
Der Fehlercode kann mit der Funktion socket_last_error() abgefragt werden. Dieser Fehlercode kann an die Funktion socket_strerror() übergeben werden, um eine textuelle Beschreibung des Fehlers zu erhalten.
Version | Beschreibung |
---|---|
8.0.0 |
socket is a Socket instance now;
previously, it was a resource.
|
Beispiel #1 Beispiel: Quell-Adresse setzen mit socket_bind():
<?php
// Einen neuen Socket erzeugen
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Eine (Beispiel-) Liste von IP-Adressen dieses Computers
$sourceips['kevin'] = '127.0.0.1';
$sourceips['madcoder'] = '127.0.0.2';
// Eine Quell-Adresse an den Socket binden
socket_bind($sock, $sourceips['madcoder']);
// Zur Zieladresse verbinden
socket_connect($sock, '127.0.0.1', 80);
// Schreiben
$request = 'GET / HTTP/1.1' . "\r\n" .
'Host: example.com' . "\r\n\r\n";
socket_write($sock, $request);
// Die Socketverbindung schlieen
socket_close($sock);
?>
Hinweis:
Diese Funktion muss vor socket_connect() aufgerufen werden.
Hinweis:
Kompatibilität mit Windows 9x/ME: socket_last_error() kann einen falschen Fehlercode zurückgeben, wenn versucht wird, den Socket an eine Adresse zu binden, die nicht dem aktuellen Rechner gehört.
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
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.
When doing Unix sockets, it might be necessary to chmod the socket file so as to give Write permission to Group and/or Others. Otherwise, only the owner is allowed to write data into the stream.
Example:
<?php
$sockpath = '/tmp/my.sock';
socket_bind($socket, $sockpath);
//here: write-only (socket_send) to others, only owner can fetch data.
chmod($sockpath, 0702);
?>
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)