FORUM DARKERS

Tecnologia & Informática => Programação => PhP/Html => Topic started by: slul on 04 de June , 2006, 06:39:50 PM

Title: Introdução a Sockets no PHP
Post by: slul on 04 de June , 2006, 06:39:50 PM
Introdução a Sockets no PHP
por Luiz Ribeiro

Você provavelmente já deve ter ouvido em falar em sockets. Com as sockets genéricas, você poderá criar conexões à servidores com bastante facilidade. Com o tema abordado neste artigo, você poderá até criar um simples bot para IRC!



Do que seria a Internet sem sockets? Como seriam conectados os computadores em redes? Seria praticamente impossível desenvolver servidores ou conectar computadores uns aos outros.

Bom, usando sockets genéricas podemos fazer conexões, uma solução simples para conectar à servidores IRC, POP, SMTP, FTP, HTTP, etc.


Ao contrário das unix sockets, usando sockets genéricas você pode realizar apenas conexões a outros servidores, ou seja, você não pode receber conexões na sua aplicação.

Para iniciar uma conexão usando sockets genéricas usamos a função fsockopen() que tem a seguinte sintaxe:


int fsockopen ( string hostname, int port [, int errno [, string errstr [, float timeout]]])


Exemplo:


$con = fsockopen("www.php.net", 80, $errno, $errstr);
if (!$con) {
    echo "Erro ao conectar em www.php.net (http://www.php.net).\n
";
    echo "Número do erro: $errno\n
Mensagem: $errstr";
}
fclose($con);
?>


No caso www.php.net (http://www.php.net) é o host ao qual nossa aplicação irá conectar na porta 80, e o script irá armazenar o número do erro na variável $errno e a mensagem em $errstr.

Agora que você já sabe abrir uma nova conexão, que tal começar a ler e escrever na mesma?

Para ler uma socket usamos a função fgets(), que tem a seguinte sintaxe:


string fgets ( int fp [, int length])


Esta função retorna uma string com o que está escrito na socket, a partir do 'ponteiro', seu primeiro parametro corresponde à variável da socket ($conex por exemplo), e o segundo parâmetro é o tamanho da string que vai ser pega da conexão.

Exemplo de uso da função fgets:


$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "Erro: $errstr ($errno)
\n";
} else {
    fputs($fp, "GET / HTTP/1.0\r\nHost: www.google.com (http://www.google.com)\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>


Este pequeno script abrirá uma conexão com o website google.com e vai 'pedir' para o servidor o conteúdo da index do site.

Você deve ter notado que nesse exemplo usamos duas funções que ainda não foram apresentadas anteriormente: fputs() e feof().

A função feof() testa se a sua conexão chegou ao 'fim-da-linha', ou seja, se já terminou de transmitir os dados que deveriam ser transmitidos (o fim do 'ponteiro').

A função fputs() escreve algo na conexão, sua sintaxe é a seguinte:


int fputs ( int fp, string str [, int length])


O primeiro parâmetro da função fputs() é a variável que a socket usa, no último exemplo foi $fp, o segundo parâmetro é a string que irá ser escrita na socket, o terceiro e último parâmetro é opcional, ele contém o tamanho da string a ser escrita na socket.


Talvez você tenha alguns problemas com sockets muito grandes, ou melhor, que ocupam mais tempo do que o tempo limite especificado no php.ini. Para solucionar este problema use a função set_time_limit(), por exemplo:


set_time_limit(100);
// aqui vai o código do seu script
?>


Este script irá permanecer ativo durante 100 segundos. Se você não tem idéia de quanto tempo o script irá precisar, você pode usar set_time_limit(0), isso irá deixar seu script sendo executado até a eternidade, ou melhor, até que o processo de seu script seja 'killado', não recomendo o uso deste método, em alguns servidores isso é proibido.

Atenção: A função set_time_limit() não funciona quando o PHP está rodando em safe_mode.

Sockets genéricas com PHP são bem fáceis de serem mantidas, espero que este artigo tenha sido de fácil entendimento e grande utilidade para você.

É basicamente isso, se você tem em mente criar algo com um bot de IRC, você tem tudo em mãos para começar a fazer o projeto, desde que você conheça bem o protocolo, se você não conhece, baixe o RFC do IRC em: http://www.rfc-editor.org (http://www.rfc-editor.org) (Não só do IRC como de outros protocolos!)

Uma dica interessante para quem está trabalhando com IRC, é digitar no mIRC:


/debug @debug


Isto irá abrir uma nova janela em seu mIRC, tudo que for recebido na conexão ou enviado por você na mesma irá aparecer nessa janela, assim você pode aprender como funciona o protocolo de maneira simples.

Um abraço,
Luiz Gustavo Cardoso Ribeiro



Não foi esrito por mim

o artigo acima foi retirado do site www.phpbrasil.com (http://www.phpbrasil.com)