Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuál es la función principal del socket en php? ¿De qué maneras se utiliza?

¿Cuál es la función principal del socket en php? ¿De qué maneras se utiliza?

PHP utiliza la biblioteca de sockets de Berkley para crear sus conexiones. Puedes saber que el socket es solo una estructura de datos. Utilice esta estructura de datos de socket para iniciar una sesión entre el cliente y el servidor. Este servidor siempre está escuchando y preparándose para generar una nueva sesión. Cuando un cliente se conecta al servidor, abre un puerto en el que el servidor está escuchando una sesión. En este momento, el servidor acepta la solicitud de conexión del cliente y luego realiza un ciclo. Ahora el cliente puede enviar información al servidor y el servidor puede enviar información al cliente.

Para generar un Socket, necesitas tres variables: un protocolo, un tipo de socket y un tipo de protocolo público. Hay tres protocolos para elegir al generar un socket. Continúe leyendo a continuación para obtener contenido detallado del protocolo.

Definir un tipo de protocolo público es un elemento esencial para la conexión. En la siguiente tabla echamos un vistazo a los tipos de protocolos públicos.

Tabla 1: Protocolo

Nombre/descripción de la constante

AF_INET Son la mayoría de los protocolos utilizados para generar sockets, utilizando TCP o UDP para la transmisión.

AF_INET6 es similar al anterior, pero se usa para direcciones IPv6

Protocolo local AF_UNIX, usado en sistemas Unix y Linux, rara vez se usa, generalmente se usa cuando el cliente y el servidor está en la misma máquina

Tabla 2: Tipo de socket

Nombre/descripción constante

SOCK_STREAM Este protocolo está en secuencia Un flujo de bytes confiable e integrado en datos -conexión basada. Este es el tipo de socket más utilizado. Este socket utiliza TCP para la transmisión.

SOCK_DGRAM Este protocolo es una llamada de transferencia de longitud fija y sin conexión. Este protocolo no es confiable y utiliza UDP para sus conexiones.

SOCK_SEQPACKET Este protocolo es una conexión confiable de doble línea que envía paquetes de datos de longitud fija para su transmisión. Este paquete debe aceptarse por completo antes de poder leerlo.

SOCK_RAW Este tipo de socket proporciona acceso único a la red. Este tipo de socket utiliza el protocolo público ICMP. (ping y traceroute usan este protocolo)

SOCK_RDM Este tipo rara vez se usa y no se implementa en la mayoría de los sistemas operativos. Se proporciona a la capa de enlace de datos y no garantiza el orden de los paquetes de datos. p>

Tabla 3: Protocolo público ***

Nombre/Descripción constante

Protocolo de mensajes de control de Internet ICMP, utilizado principalmente en puertas de enlace y hosts para verificar el estado de la red e informar errores mensajes

Protocolo de datagramas de usuario UDP, que es un protocolo de transmisión no confiable y sin conexión

Protocolo de control de transmisión TCP, que es el protocolo de transmisión confiable más comúnmente utilizado Un protocolo público que garantiza que los paquetes de datos puede llegar al destinatario. Si se produce un error durante la transmisión, reenviará el paquete de error.

Ahora que conoces los tres elementos que generan un socket, usamos la función socket_create() en PHP para generar un socket. Esta función socket_create() requiere tres parámetros: un protocolo, un tipo de socket y un protocolo público. La función socket_create() devuelve un tipo de recurso que contiene el socket si tiene éxito, o false si falla.

Resource socket_create(int protocol, int socketType, int commonProtocol);

Ahora generas un socket, ¿y luego qué? PHP proporciona varias funciones para manipular sockets.

Puede vincular un socket a una IP, escuchar la comunicación de un socket y aceptar un socket. Ahora veamos un ejemplo para comprender cómo la función genera, acepta y escucha un socket.

$commonProtocol = getprotobyname("tcp");

$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

socket_bind($socket, 'localhost', 1337);

socket_listen($socket);

// Más funciones de socket por venir >>p>

El ejemplo anterior genera su propio lado del servidor. La primera línea del ejemplo,

$commonProtocol = getprotobyname("tcp");

Utilice el nombre del protocolo público para obtener un tipo de protocolo. Aquí se utiliza el protocolo público TCP. Si desea utilizar el protocolo UDP o ICMP, debe cambiar los parámetros de la función getprotobyname() a "udp" o "icmp". Una alternativa es no utilizar la función getprotobyname() sino especificar SOL_TCP o SOL_UDP en la función socket_create().

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

La segunda línea del ejemplo genera un socket y devuelve una instancia del recurso de socket. Una vez que tenga una instancia del recurso de socket, debe vincular el socket a una dirección IP y un puerto.

socket_bind($socket, ‘localhost’, 1337);

Aquí vincula el socket a la computadora local (127.0.0.1) y vincula el socket a su puerto 1337. Luego debe escuchar todas las conexiones de socket entrantes.

socket_listen($socket);

Después de la cuarta línea, debe comprender todas las funciones de socket y su uso.

Tabla 4: Función de socket

Descripción del nombre de la función

socket_accept() acepta una conexión de socket

socket_bind() vincula el socket On una dirección IP y un puerto

socket_clear_error() borra el error del socket o el último código de error

socket_close() cierra un recurso de socket

socket_connect() Inicia un socket conexión

socket_create_listen() abre un socket escuchando en el puerto especificado

socket_create_pair() genera un par de sockets indiferenciados en una matriz

socket_create () Genera un socket, que equivale a generar una estructura de datos de socket

socket_get_option() Obtiene la opción de socket

socket_getpeername() Obtiene la dirección IP de un host remoto similar

socket_getsockname() Obtiene la dirección IP del socket local

socket_iovec_add() Agrega un nuevo vector a una matriz dispersa/agregada

socket_iovec_alloc() Esta función crea un canal que puede enviar , recibir y leer Escribir estructura de datos iovec

socket_iovec_delete() elimina un iovec asignado

socket_iovec_fetch() devuelve los datos del recurso iovec especificado

socket_iovec_free() libera un recurso iovec

socket_iovec_set() establece el nuevo valor de los datos iovec

socket_last_error() obtiene el último código de error del socket actual

socket_listen() escucha el socket especificado Todas las conexiones

socket_read() lee datos de la longitud especificada

socket_readv() lee datos de la matriz dispersa/agregada

socket_recv( ) del socket Finaliza los datos en el caché

socket_recvfrom() acepta datos del socket especificado; si no se especifica, el socket actual será el predeterminado

socket_recvmsg() acepta mensajes de iovec

socket_select() Selección múltiple

socket_send() Esta función envía datos al socket conectado

socket_sendmsg() Envía un mensaje al socket

socket_sendto() Envía un mensaje al socket en la dirección especificada

socket_set_block() Configura el socket en modo de bloqueo

socket_set_nonblock() Configura el socket en modo sin bloqueo

socket_set_option() Establecer opciones de socket

socket_shutdown() Esta función le permite cerrar la lectura, escritura o el socket especificado

socket_strerror() devuelve un error detallado con el número de error especificado

socket_wri

te() escribe datos en la caché del socket

socket_writev() escribe datos en la matriz dispersa/agregada

(Nota: la introducción de la función ha eliminado parte del texto original. Para obtener información detallada sugerencias sobre el uso de la función, consulte el texto original en inglés o consulte el manual de PHP)

Todas las funciones anteriores están relacionadas con sockets en PHP. Para usar estas funciones, debe abrir su socket. no lo ha abierto, edite su archivo php.ini, elimine el comentario antes de la siguiente línea:

extension=php_sockets.dll

Si no puede eliminar el comentario, entonces utilice el siguiente código para cargar la biblioteca de extensiones:

if(!extension_loaded('sockets'))

{

if(strtoupper(substr(PHP_OS, 3)) = = "GANAR")

{

dl('php_sockets.dll');

}

else

{

dl('sockets.so');

}

} >

Si no sabe si su socket está abierto, puede usar la función phpinfo() para determinar si el socket está abierto. Puede comprobar si el socket está abierto consultando la información de phpinfo. Como se muestra a continuación:

Ver la información de phpinfo() sobre el socket

◆ Generar un servidor

Ahora mejoraremos el primer ejemplo. Necesita escuchar un socket específico y manejar las conexiones de los usuarios.

$commonProtocol = getprotobyname("tcp");

$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

socket_bind($socket, 'localhost', 1337);

socket_listen($socket);

// Acepta cualquier conexión entrante al servidor

$conexión = socket_accept($socket);

if($conexión)

{

socket_write($conexión, "Te has conectado al socket .../n/r");

}

Debe utilizar el símbolo del sistema para ejecutar este ejemplo. La razón es que aquí se generará un servidor, no una página web. Si intenta ejecutar este script utilizando un navegador web, es muy probable que supere el límite de 30 segundos. Puede utilizar el siguiente código para establecer un tiempo de ejecución infinito, pero se recomienda utilizar el símbolo del sistema para ejecutar.

set_time_limit(0);

Una prueba simple de este script en el símbolo del sistema:

Php.exe ejemplo01_server.php

Si no ha establecido la ruta al intérprete de php en las variables de entorno del sistema, deberá especificar la ruta detallada a php.exe. Cuando ejecuta el servidor, puede probarlo conectándose al puerto 1337 a través de telnet. Como se muestra a continuación:

El servidor anterior tiene tres problemas: 1. No puede aceptar múltiples conexiones. 2. Sólo completa un comando. 3. No puede conectarse a este servidor a través de un navegador web.

Este primer problema es más fácil de solucionar puedes utilizar una aplicación para conectarte al servidor cada vez. Pero el siguiente problema es que necesita utilizar una página web para conectarse al servidor, lo cual es más difícil. Puede hacer que su servidor acepte la conexión, escriba algunos datos al cliente (si debe escribirlos), cierre la conexión y espere la siguiente conexión.

Mejora el código anterior y genera el siguiente código para crear tu nuevo servidor:

// Configura nuestro socket

$commonProtocol = getprotobyname("tcp");

$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);

socket_bind($socket, 'localhost', 1337) ;

socket_listen($socket);

// Inicializar el buffer

$buffer = "NO DATA";

p>

while(true)

{

// Acepta cualquier conexión que entre en este socket

$connection = socket_accept($socket

<); p> printf("Socket conectado/r/n");

// Comprueba si hay algo en el buffer

if($buffer ! = "")

{

printf("Algo está en el buffer...enviando datos.../r/n");

socket_write ($conexión, $ buffer "/r/n");

printf("Escribió en socket/r/n");

}

else

{

printf("No hay datos en el buffer/r/n");

}

// Obtener la entrada

while($datos = socket_read($conexión, 1024, PHP_NORMAL_READ))

{

$buffer = $datos;

socket_write($conexión , "Información recibida/r/n");

printf("Buffer: " . $buffer . "/r/n");

}

socket_close($conexión);

printf("Cerró el socket/r/n/r/n");

}

¿Qué debería hacer esto? servidor hacer? Inicializa un socket y abre un caché para enviar y recibir datos. Espera una conexión y una vez realizada, imprime "Socket conectado" en la pantalla del lado del servidor. Este servidor verifica el búfer y, si hay datos en el búfer, los envía a la computadora conectada. Luego envía un mensaje de aceptación para estos datos. Una vez que acepta el mensaje, lo guarda en los datos, informa a la computadora conectada del mensaje y finalmente cierra la conexión.

Cuando se cierra la conexión, el servidor comienza a procesar la siguiente conexión. (Mala traducción, texto original adjunto)

Esto es lo que hace el servidor. Inicializa el socket y el buffer que usas para recibir

y luego espera un mensaje. conexión Una vez que se crea una conexión, imprime

“Socket conectado” en la pantalla en la que se está ejecutando el servidor. Luego, el servidor verifica si

hay algo en el búfer. si lo hay, envía los datos a la computadora conectada.

Después de enviar los datos, espera recibir información. Una vez que recibe la información, la almacena

en los datos. la computadora conectada sabe que ha recibido la información y

luego cierra la conexión. Una vez cerrada la conexión, el servidor inicia todo el

proceso nuevamente.

◆ Generar un cliente

Manejar el segundo problema es fácil. Necesita generar una página php, conectarse a un socket, enviar algunos datos a su caché y procesarlos. Luego, después de procesar los datos nuevamente, puede enviarlos al servidor. En otra conexión de cliente, procesará esos datos.

Resolver el segundo problema es muy fácil. Necesita crear una página PHP que se conecte a un socket, recibir los datos que se encuentran en el búfer y procesarlos. ha procesado los datos en el búfer, puede enviar sus datos al servidor. Cuando otro cliente se conecte, procesará los datos que envió y el cliente enviará más datos. de regreso al servidor.

El siguiente ejemplo demuestra el uso del socket:

// Crea el socket y conéctate

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$conexión = socket_connect($socket,'localhost', 1337);

while($buffer = socket_read( $ socket, 1024, PHP_NORMAL_READ))

{

if($buffer == “SIN DATOS”)

{

echo ( "

SIN DATOS

");

descanso;

}

más

{

// Hacer algo con los datos en el buffer

echo(“

Datos del buffer: “ . $buffer . “

”);

}

}

echo(“

Escribiendo en Socket

”);

// Escribe algunos datos de prueba en nuestro socket

if(!socket_write($socket, “ALGUNOS DATOS/r/n”))

{

echo(“

Error de escritura

” );

}

// Leer cualquier respuesta del socket

while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))

{

echo(“

Los datos enviados fueron: ALGUNOS DATOS
La respuesta fue:” . $buffer . “

”);

}

echo(“

Lectura terminada desde el socket

”);

El código en este ejemplo muestra cómo el cliente se conecta al servidor. El cliente lee los datos.

Si esta es la primera conexión que llega en este ciclo, el servidor enviará "SIN DATOS" al cliente. Si esto sucede, el cliente está por encima de la conexión. El cliente envía sus datos al servidor, los datos se envían al servidor y el cliente espera una respuesta. Una vez recibida la respuesta, escribe la respuesta en la pantalla.