¿Qué es un socket?
Un socket es un punto de comunicación entre dos máquinas.
Modelo Cliente-Servidor

Tipicamente los sockets BSD consisten en dos niveles de procesos de aplicación separados; un proceso (el cliente) realiza una conexión mientras que el segundo proceso (servidor) las acepta, a esto se le conoce como Modelo Cliente – Servidor.
Tipos de Sockets
- Sockets STREAM
Este tipo de socket permite trabajar realizando/esperando conexiones a puertos TCP.
- DATAGRAM
Lo mismo que el anterior pero trabajando con paquetes UDP
- RAW
O mejor conocidos como de bajo nivel, permiten trabajar con las cabeceras IP, TCP, UDP, construir nuestros propios packetes etc.. Por desgracia no veremos su implementación.
Implementación en PHP.
PHP no sólo nos ofrece la función “fsockopen” para tratar con sockets, también nos permite trabajar con Sockets BSD, del cuál he visto muy poca información.
Instalación en Linux
Por fortuna para los usuarios de Linux los sockets BSD ya vienen habilitados, y si no, tendremos que recompilar nuestro php con la opción “—socket”.
Instalación en Windows
Para los usuarios de Windows PHP no trae la extensión habilitada.
Para habilitar los sockets bsd seguir los siguientes 4 pasos:
- Ir a la carpeta donde está instalado php y abrir el fichero “php.ini”.
- Buscar la línea ;extension=php_sockets.dll y remover el punto y coma que tiene al principio.
- Buscar la línea que contiene el directorio de extensiones php “extension_dir” y verificar que en la ruta declarada se encuentre la librería “php_sockets.dll”.
- Salvar los cambios en el php.ini.
Ya que tenemos habilitados los sockets en PHP sea en Windows o Linux nos dedicaremos ahora a su implementación! (Lo que tanto hemos esperado muchachos!)
Ejemplo de Cliente.
Me pondría a explicar cada una de las funciones con sus prototipos para que todos pudieramos entender pero sería muy aburrido y pienso que es más fácil comprender/aprender con un buen código por lo tanto aquí les dejo un ejemplo de cómo conectar con algoritmatica
// Creamos un socket con socket_create, le pasamos como primer parámetro la constante del tipo de dominio a utilizar, luego el tipo de socket (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW) y por ultimo el protocolo
$result = socket_connect($sock,gethostbyname(“www.algoritmatica.com”),80);
// Pasamos como primer parámetro el descriptor del socket creado, usamos gethostbyname para resolver el nombre de dominio (host) y por último indicamos que queremos conectar al puerto 80
// Creamos la petición HTTP
$header .= “HEAD / HTTP/1.0\r\n”;
$header .= “Host: www.algoritmatica.com”;
$header .= “Connection:Close”;
socket_write($sock,$header,strlen($header));
// Pasamos como primer parámetro el descriptor de socket, la petición http y su tamaño en bytes usando la función strlen.
while($respuesta = socket_read($sock,2048))
// Esperamos la respuesta y los datos.
{
echo $respuesta;
}
socket_close($sock);
// Cerramos socket y conexión.
Ejemplo de servidor
Este ejemplo está extraído de la referencia de PHP
(que todos deberíamos tener a la hora de programar... agradezco el código!)
ob_implicit_flush();
$address = '192.168.1.3';
$port = 10000;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) <0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}
if (($ret = socket_bind($sock, $address, $port)) <0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}
if (($ret = socket_listen($sock, 5)) <0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
}
do {
if (($msgsock = socket_accept($sock)) <0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
}
/* Send instructions. */
$msg = "\nWelcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
Fin
He dado una pequeña introducción a los sockets, el modelo cliente-servidor y sockets en PHP, sería interesante que para una próxima entrada escriba sobre sockets pero en C y su implementación en windows (winsockets).
¿Algún comentario o sugerencia? cualquier cosa será bienvenida! no dejes de comentar!
gracias.
Para mayor información:
http://www.php.net/manual/es/ref.sockets.php







