1
0
mirror of https://github.com/php/doc-es.git synced 2026-04-27 09:08:15 +02:00
Files
archived-doc-es/reference/sockets/reference.xml
T
2003-12-16 03:10:11 +00:00

270 lines
8.3 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.3 $ -->
<!-- EN-Revision: 1.15 Maintainer: lboshell Status: ready -->
<reference id="ref.sockets">
<title>Funciones de Socket</title>
<titleabbrev>Sockets</titleabbrev>
<partintro>
<section id="sockets.intro">
&reftitle.intro;
<para>
La extensi&oacute;n de sockets implementa una interfaz de bajo nivel
con las funciones de comunicaci&oacute;n de sockets, basadas en los
populares sockets BSD, ofreciendo la posibilidad de actuar como un
servidor de sockets, as&iacute; como cliente.
</para>
<para>
Para una interfaz m&aacute;s gen&eacute;rica de sockets del lado del
cliene, vea
<function>stream_socket_client</function>,
<function>stream_socket_server</function>,
<function>fsockopen</function>, y
<function>pfsockopen</function>.
</para>
<para>
Cuando use estas funciones, es importante recordar que, aunque muchas
de ellas tienen nombres id&eacute;nticos a sus contrapartes en C,
usualmente cuentan con declaraciones distintas. Por favor,
aseg&uacute;rese de leer las descripciones, con el prop&oacute;sito de
evitar confusiones.
</para>
<para>
Aquellos que no se encuentran familiarizados con programaci&oacute;n
de sockets, pueden encontrar una gran cantidad de material &uacute;til
en las p&aacute;ginas man de Unix apropiadas, y existe una enorme
cantidad de informaci&oacute;n estilo tutorial sobre
programaci&oacute;n de sockets en C en la web, mucha de la cual puede
aplicarse, con ligeras modificaciones, a la programaci&oacute;n de
sockets en PHP. El <ulink url="&url.socket.faq;">FAQ de Sockets
UNIX</ulink> puede ser un buen comienzo.
</para>
&warn.experimental;
</section>
<section id="sockets.requirements">
&reftitle.required;
&no.requirement;
</section>
&reference.sockets.configure;
<section id="sockets.configuration">
&reftitle.runtime;
&no.config;
</section>
<section id="sockets.resources">
&reftitle.resources;
&no.resource;
</section>
&reference.sockets.constants;
<section id="sockets.errors">
<title>Errores de Socket</title>
<para>
La extensi&oacute;n de sockets fue escrita para ofrecer una interfaz
usable a los poderosos sockets BSD. Se ha tenido cuidado para que las
funciones trabajen igualmente bien en implementaciones Win32 y
Unix. Casi todas las funciones de sockets pueden fallar bajo ciertas
condiciones y por lo tanto emiten un
mensaje <constant>E_WARNING</constant> que describe el error. Algunas
veces esto no ocurre conforme al deseo del desarrollador. Por ejemplo,
la funci&oacute;n <function>socket_read</function> puede emitir
repentinamente un mensaje <constant>E_WARNING</constant> debido a que
la conexi&oacute;n ha sido cerrada inesperadamente. Es com&uacute;n
suprimir la advertencia con el operador <literal>@</literal> y atrapar
el c&oacute;digo de error dentro de la aplicaci&oacute;n con la
funci&oacute;n <function>socket_last_error</function>. Puede llamar la
funci&oacute;n <function>socket_strerror</function> con &eacute;ste
c&oacute;digo de error para recuperar una cadena que describe el
error. Vea su descripci&oacute;n para m&aacute;s informaci&oacute;n.
</para>
<note>
<para>
Los mensajes <constant>E_WARNING</constant> generados por la
extensi&oacute;n de sockets se encuentran en Ingl&eacute;s, aunque el
mensaje de error recuperado aparecer&aacute; dependiendo de la
localidad actual (<constant>LC_MESSAGES</constant>):
<programlisting role="php">
<![CDATA[
Warning - socket_bind() unable to bind address [98]: Die Adresse wird bereits verwendet
]]>
</programlisting>
</para>
</note>
</section>
<section id="sockets.examples">
&reftitle.examples;
<para>
<example>
<title>Ejemplo de Socket: Servidor TCP/IP simple</title>
<para>
Este ejemplo le muestra un servidor simple que repite de vuelta su
entrada. Modifique las variables <varname>direccion</varname> y
<varname>puerto</varname> para que se acomoden a su
configuraci&oacute;n y ejec&uacute;telo. Puede entonces conectarse con
el servidor mediante un comando similar a: <command>telnet
192.168.1.53 10000</command> (en donde la direcci&oacute;n y el puerto
se ajustan a su configuraci&oacute;n). Cualquier cosa que escriba
ser&aacute; entonces impresa en el lado del servidor, y devuelta a su
lado. Para desconectarse, ingrese 'salir'.
</para>
<programlisting role="php">
<![CDATA[
#!/usr/local/bin/php -q
<?php
error_reporting(E_ALL);
/* Permitir que el script permanezca en espera de conexiones. */
set_time_limit(0);
/* Habilitar vaciado de salida implicito, de modo que veamos lo que
* obtenemos a medida que va llegando. */
ob_implicit_flush();
$direccion = '192.168.1.53';
$puerto = 10000;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() fall&oacute;: motivo: " . socket_strerror($sock) . "\n";
}
if (($ret = socket_bind($sock, $direccion, $puerto)) < 0) {
echo "socket_bind() fall&oacute;: motivo: " . socket_strerror($ret) . "\n";
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() fall&oacute;: motivo: " . socket_strerror($ret) . "\n";
}
do {
if (($mens_sock = socket_accept($sock)) < 0) {
echo "socket_accept() fall&oacute;: motivo " . socket_strerror($mens_sock) . "\n";
break;
}
/* Enviar instrucciones. */
$mensaje = "\nBienvenido al Servidor de Prueba PHP. \n" .
"Para salir, escriba 'salir'. " .
"Para detener el servidor, escriba 'detener'.\n";
socket_write($mens_sock, $mensaje, strlen($mensaje));
do {
if (false === ($buf = socket_read($mens_sock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() fall&oacute;: motivo: " . socket_strerror($ret) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'salir') {
break;
}
if ($buf == 'detener') {
socket_close($mens_sock);
break 2;
}
$respuesta = "PHP: Usted dijo '$buf'.\n";
socket_write($mens_sock, $respuesta, strlen($respuesta));
echo "$buf\n";
} while (true);
socket_close($mens_sock);
} while (true);
socket_close($sock);
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Ejemplo de Socket: Cliente TCP/IP simple</title>
<para>
Este ejemplo muestra un cliente HTTP simple, de un paso. Simplemente
se conecta con una p&aacute;gina, envia una petici&oacute;n HEAD,
imprime la respuesta, y sale.
</para>
<programlisting role="php">
<![CDATA[
<?php
error_reporting(E_ALL);
echo "<h2>Conexi&oacute;n TCP/IP</h2>\n";
/* Obtener el puerto para el servicio WWW. */
$puerto_servicio = getservbyname('www', 'tcp');
/* Obtener la direccion IP del host de destino. */
$direccion = gethostbyname('www.example.com');
/* Crear un socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() fall&oacute;: motivo: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}
echo "Intentando una conexi&oacute;n con '$direccion' en el puerto '$puerto_servicio'...";
$resultado = socket_connect($socket, $direccion, $puerto_servicio);
if ($resultado < 0) {
echo "socket_connect() fall&oacute;.\nMotivo: ($resultado) " .
socket_strerror($resultado) . "\n";
} else {
echo "OK.\n";
}
$entrada = "HEAD / HTTP/1.1\r\n";
$entrada .= "Host: www.example.com\r\n";
$entrada .= "Connection: Close\r\n\r\n";
$salida = '';
echo "Enviando petici&oacute;n HTTP HEAD...";
socket_write($socket, $entrada, strlen($entrada));
echo "OK.\n";
echo "Leyendo respuesta:\n\n";
while ($salida = socket_read($socket, 2048)) {
echo $salida;
}
echo "Cerrando socket...";
socket_close($socket);
echo "OK.\n\n";
?>
]]>
</programlisting>
</example>
</para>
</section>
</partintro>
&reference.sockets.functions;
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->