Crearea unui Daemon in PHP - Partea 2
Okey, in prima parte a acestui articol am descris fiecare functie legata de socket pe care o vom folosi in tutorial.
Avand in vedere ca este un script PHP, vom incepe scriptul cu tag-ul de deschidere <?php si set_time_limit(0), deoarece Daemon-ul, prin menirea sa, trebuie sa ruleze fara oprire.
In acest tutorial voi prezenta crearea unui Daemon care trimite un mesaj de intampinare la accesare si calculeaza suma a 2 numere dupa care deconecteaza clientul.
Variabilele folosite in script:
$Socket - Resursa SOCKET;
$IP - IP-ul host (cel care accepta conexiuni);
$Port - Port pe care se accepta conexiunile;
$Conexiune - Conexiune acceptata cu functia socket_accept;
$Date - Date trimise/primite spre/de la client;
$Intampinare - Mesaj de intampinare client;
Sa incepem cu inceputul… avem resursa Socket initializata ca AF_INET, SOCK_STREAM (Conexiune de tip IPv4/TCP) ce accepta conexiuni nelimitate pe ip-ul 127.0.0.1 (localhost), port 4444.
Pana aici avem urmatorul script:
<?
set_time_limit(0);$IP = ‘127.0.0.1′;
$Port = ‘4444′;
$Intampinare = “Salut, acesta este un exemplu de calculator (a+b).\n”;$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);
$Conexiune = socket_accept($Socket);
?>
Pentru a rula continuu, partea cu socket_accept trebuie sa ruleze intr-o bucla de tip WHILE in care sa execute operatiile.
Se ajunge la urmatorul script:
<?
set_time_limit(0);$IP = ‘127.0.0.1′;
$Port = ‘4444′;
$Intampinare = “Salut, acesta este un exemplu de calculator (a+b).\n”;$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);while($Conexiune = socket_accept($Socket)){
}
?>
Acum, in interiorul buclei WHILE putem sa citim si sa scriem catre un client.
In primul rand ii transmitem clientului proaspat conectat mesajul de intampinare:
socket_write($Conexiune, $Intampinare, strlen ($Intampinare));
dupa care afisam textul “a =” pentru a sti clientul ce are de facut si imediat dupa aceea citim ce introduce clientul de la tastatura. Aceasta operatie se face de 2 ori (o data pentru “a”, apoi pentru “b”). Deoarece utilizatorul poate introduce si altceva decat valori numerice, se pune conditia de float pentru ce se citeste de la tastatura.
Dupa realizarea operatiei de adunare se afiseaza rezultatul alaturi de mesajul de adio si se inchide conexiunea catre client
$Date = “a = “;
socket_write($Conexiune, $Date, strlen ($Date));
$Date = socket_read($Conexiune, 1024);
$a = (float) $Date;$Date = “b = “;
socket_write($Conexiune, $Date, strlen ($Date));
$Date = socket_read($Conexiune, 1024);
$b = (float) $Date;$c = $a + $b;
$Date = “Rezultatul adunarii $a + $b este $c\nBye Bye\n”;
socket_write($Conexiune, $Date, strlen ($Date));
socket_close($Conexiune);
Asadar, scriptul complet este urmatorul:
<?
set_time_limit(0);
$IP = '127.0.0.1';
$Port = '4444';
$Intampinare = "Salut, acesta este un exemplu de calculator (a+b).\n";
$Socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($Socket, $IP, $Port);
socket_listen($Socket, 0);
while($Conexiune = socket_accept($Socket)){
socket_write($Conexiune, $Intampinare, strlen ($Intampinare));
$Date = "a = ";
socket_write($Conexiune, $Date, strlen ($Date));
$Date = socket_read($Conexiune, 1024);
$a = (float) $Date;
$Date = "b = ";
socket_write($Conexiune, $Date, strlen ($Date));
$Date = socket_read($Conexiune, 1024);
$b = (float) $Date;
$c = $a + $b;
$Date = "Rezultatul adunarii $a + $b este $c\nBye Bye\n";
socket_write($Conexiune, $Date, strlen ($Date));
socket_close($Conexiune);
}
socket_close($Socket);
?>
Orice fel de sugestii pentru imbunatatirea calitatii acestui website sunt binevenite

May 26th, 2009 at 7:51 PM
Salut, am incercat sa rulez scriptul tau si primesc o eroare in genul
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Only one usage of each socket address (protocol/network address/port) is normally permitted. in
Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: An invalid argument was supplied. in
Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [0]: An invalid argument was supplied.
Am un pachet wamp instalat, crezi ca e din cauza php-ului meu (5.2.9-2)? Ca nu pot sa imi dau seama cum sa fixez erorile.
cateva date din phpinfo:
IPv6 Support enabled
Registered PHP Streams php, file, data, http, ftp, compress.zlib
Registered Stream Socket Transports tcp, udp .
Mersi anticipat &&…keep it up!
June 1st, 2009 at 7:32 PM
Probabil adresa + port este folosita de o alta aplicatie, sau incerci sa pornesti de mai multe ori acelasi script.
July 1st, 2009 at 1:48 PM
cum pot falosi un script