(PHP 5, PHP 7)
stream_socket_server — Crear un socket de servidor de dominio de Internet o de Unix
$local_socket
[, int &$errno
[, string &$errstr
[, int $flags
= STREAM_SERVER_BIND | STREAM_SERVER_LISTEN
[, resource $context
]]]] ) : resource
Crea un socket de flujo o de datagrama en
local_socket
.
Esta función sólo crea un socket, para empezar a aceptar conexiones use stream_socket_accept().
local_socket
El tipo de socket creado se determina por el transporte especificado usando el formato de URL estándar: transporte://objetivo.
Para sockets de Dominio de Internet (AF_INET
) como TCP y UDP,
la porción del objetivo del parámetro
remote_socket
debería consistir en
un nombre de host o dirección IP seguida de dos puntos y un número de puerto. Para sockets
de dominio de Unix, la porción del objetivo apuntará
al archivo de socket del sistema de archivos.
Dependiendo del entorno, los sockets de dominio Unix pueden no estar disponibles. Una lista de transportes disponibles se puede recuperar unsado stream_get_transports(). Véase Lista de Transportes de Sockets Soportados para una lista de transportes incluidos.
errno
Si los argumentos opcionales errno
y errstr
están presentes, serán establecidos para indicar el error a nivel de sistema
ocurrido en las llamadas a nivel de sistema de socket(),
bind(), y listen(). Si
el valor devuelto en errno
es
0 y la función devuelve FALSE
, es una indicación
de que el error ocurrió antes de la llamada a bind().
Esto es lo más probable debido a un problema de inicialización del socket.
Observe que los argumentos errno
y
errstr
siempre serán pasados por referencia.
errstr
Véase la descripción de errno
.
flags
Campo de máscara de bits que puede ser establecido a cualquier combinación de banderas de conexión.
Nota:
Para sockets UDP, se debe usar
STREAM_SERVER_BIND
como parámetroflags
.
context
Devuelve un flujo creado, o FALSE
si se produjo un error.
Ejemplo #1 Usar sockets de servidor de TCP
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($conn = stream_socket_accept($socket)) {
fwrite($conn, 'La fecha y hora actuales es ' . date('n/j/Y g:i a') . "\n");
fclose($conn);
}
fclose($socket);
}
?>
El ejemplo de abajo muestra cómo actuar como un servidor de hora que responde a peticiones de hora como se muestra en un ejemplo de stream_socket_client().
Nota: La mayoría de los sistemas requieren acceso root para crear un socket de servidor sobre un puerto inferor a 1024.
Ejemplo #2 Usar sockets de servidor de UDP
<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
die("$errstr ($errno)");
}
do {
$pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
echo "$peer\n";
stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);
?>
Nota: Cuando se especifique una dirección numérica IPv6 (por ej., fe80::1), la IP debe ser encerrada entre corchetes — por ejemplo, tcp://[fe80::1]:80.