Forum und email

Funções de Socket

Introdução

A extensão socket implementa uma interface de baixo nível para funções de comunicação sockets baseadas no popular BSD sockets, disponibilizando acionar como um servidor socket ou como um cliente.

Para saber mais informações sobre sockets cliente-servidor, veja stream_socket_client(), stream_socket_server(), fsockopen(), e pfsockopen().

Quando usando estas funções, é importante relembrar que enquanto muitas delas tem nomes idênticos equivalentes em C, eles tem frequentemente declarações diferentes. Por favor tenha certeza lendo as descrições para evitar confusão.

Aqueles não familiarizados com programação usando socket podem encontrar muito material útil nas "man pages" de Unix, e há uma infinidade de tutoriais com informações usando socket em C na web, muito dos quais podem ser aplicados, com pequenas modificações, para programação usando socket em PHP. O » UNIX Socket FAQ pode ser um bom começo.

Aviso

Este módulo é EXPERIMENTAL. Isso quer dizer que o comportamento neste módulo --- incluindo suas funções e seus nomes, e TUDO mais que está documentado sobre esse módulo --- poderá mudar em futuras versões do PHP, SEM QUALQUER NOTIFICAÇÃO. Esteja avisado, e use este módulo por sua própria conta e risco.

Dependências

Nenhuma biblioteca externa é necessária para compilar esta extensão.

Instalação

As funções de socket descritas aqui fazem parte de uma extensão do PHP que deve ser habilitada na hora de compilar adicionando a opção --enable-sockets à linha de comando configure.

Nota: O suporte ao IPv6 foi acrescentado no PHP 5.0.0.

Configurações em execução

Esta extensão não define nenhum parâmetro de configuração no php.ini.

Tipos Resource

Esta extensão não possui nenhum tipo resource.

Constantes pré-definidas

As contantes abaixo são definidas por esta extensão e somente estarão disponíveis quando a extensão foi compilada com o PHP ou carregada dinamicamente durante a execução.

AF_UNIX (integer)
AF_INET (integer)
AF_INET6 (integer)
SOCK_STREAM (integer)
SOCK_DGRAM (integer)
SOCK_RAW (integer)
SOCK_SEQPACKET (integer)
SOCK_RDM (integer)
MSG_OOB (integer)
MSG_WAITALL (integer)
MSG_PEEK (integer)
MSG_DONTROUTE (integer)
MSG_EOR (integer)
MSG_EOF (integer)
SO_DEBUG (integer)
SO_REUSEADDR (integer)
SO_KEEPALIVE (integer)
SO_DONTROUTE (integer)
SO_LINGER (integer)
SO_BROADCAST (integer)
SO_OOBINLINE (integer)
SO_SNDBUF (integer)
SO_RCVBUF (integer)
SO_SNDLOWAT (integer)
SO_RCVLOWAT (integer)
SO_SNDTIMEO (integer)
SO_RCVTIMEO (integer)
SO_TYPE (integer)
SO_ERROR (integer)
SOL_SOCKET (integer)
PHP_NORMAL_READ (integer)
PHP_BINARY_READ (integer)
SOL_TCP (integer)
SOL_UDP (integer)

Socket Errors

A extensão socket foi escrita para disponibilizar uma interface útil e poderosa para sockets BSD. Tem-se notado que as funções funcionam igualmente bem em Win32 e Unix. Quase todas as funções de sockets devem falhar sob certas condições e portanto emite uma mensagem E_WARNING descrevendo o erro. De vez em quando isso não acontece para desespero do desenvolvedor. Por exemplo a função socket_read() deve de repente emitir uma mensagem E_WARNING porque a conexão foi quebrada inesperadamente. É comum esconder as mensagens de warning com o operador @ e pegar o código de erro dentro da aplicação com a função socket_last_error(). Você deve chamar a função socket_strerror() com esse código de erro para retornar uma string descrevendo o erro. Veja sua descrição para mais informações.

Nota: A mensagem de E_WARNING gerada pela extensão socket estão em inglês dificilmente a mensagem de erro retornada ira aparecer correto dependendo da localidade padrão (LC_MESSAGES):

Warning - socket_bind() unable to bind address [98]: Die Adresse wird bereits verwendet

Exemplos

Example#1 Exemplo de socket: Simples servidor TCP/IP

Este exemplo mostra uma simples troca de informações do servidor. Alterar as variáveis address e port para o conjunto da sua configuração e execução. Você deve então conectar o servidor com uma linha de comando similiar a: telnet 192.168.1.53 10000 (onde o endereço e a porta partem da sua configuração). Algo que você digitar então irá sair no lado do servidor, e mostrar isso para você. Para desconectar, digite 'quit'.

#!/usr/local/bin/php -q
<?php
error_reporting 
(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit (0);

/* Turn on implicit output flushing so we see what we're getting
 * as it comes in. */
ob_implicit_flush ();

$address '192.168.1.53';
$port 10000;

if ((
$sock socket_create (AF_INETSOCK_STREAM0)) < 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 ($sock5)) < 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$msgstrlen($msg));

    do {
        if (
FALSE === ($buf socket_read ($msgsock2048PHP_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$talkbackstrlen ($talkback));
        echo 
"$buf\n";
    } while (
true);
    
socket_close ($msgsock);
} while (
true);

socket_close ($sock);
?>

Example#2 Exemplo de Socket: Simples cliente TCP/IP

Este exemplo mostra um simples, one-shot cliente HTTP. Isso simplesmente conecta à uma página, envia um cabeçalho de requisição, mostra a resposta, e sai.

<?php
error_reporting 
(E_ALL);

echo 
"<h2>TCP/IP Connection</h2>\n";

/* Get the port for the WWW service. */
$service_port getservbyname ('www''tcp');

/* Get the IP address for the target host. */
$address gethostbyname ('www.example.com');

/* Create a TCP/IP socket. */
$socket socket_create (AF_INETSOCK_STREAM0);
if (
$socket 0) {
    echo 
"socket_create() failed: reason: " socket_strerror ($socket) . "\n";
} else {
    echo 
"OK.\n";
}

echo 
"Attempting to connect to '$address' on port '$service_port'...";
$result socket_connect ($socket$address$service_port);
if (
$result 0) {
    echo 
"socket_connect() failed.\nReason: ($result) " socket_strerror($result) . "\n";
} else {
    echo 
"OK.\n";
}

$in "HEAD / HTTP/1.0\r\n\r\n";
$out '';

echo 
"Sending HTTP HEAD request...";
socket_write ($socket$instrlen ($in));
echo 
"OK.\n";

echo 
"Reading response:\n\n";
while (
$out socket_read ($socket2048)) {
    echo 
$out;
}

echo 
"Closing socket...";
socket_close ($socket);
echo 
"OK.\n\n";
?>

Índice