rendered paste body#!/usr/local/bin/php<?php/*** Projet WIG (Wdmédia IRC Gateway)* Passerelle de liaison IRC / flash* IRC / flash Gateway** Ce code est sous license* Creative Commons Attribution-NonCommercial-ShareAlike 1.0* Plus d'information : http://creativecommons.org/licenses/by-nc-sa/1.0/** @author Nicolas Lafont aka Manico (wig@wdmedia.net)* @copyright Copyright 2003,2004 Nicolas Lafont aka Manico* @package WIG* @link http://www.wdmedia.org/WIG/* @version 0.7* @since 10-12-2003* @last-modified 06-08-2004*//** Configuration*/define('IRC_ADDR', '127.0.0.1');define('IRC_PORT', '6667');define('FLASH_ADDR', '127.0.0.1');define('FLASH_PORT', '6679');define('MAXLINE', '2048');define('MAXCONCURRENT', '25');/** Fin de la configuration*/// Modification de configuration phperror_reporting (E_ALL);set_time_limit(0);ob_implicit_flush ();// Fonction de decodage utf8// hack for utf8function smart_utf8_decode($in_str) { $new_str = str_replace('?', 'q0u0e0s0t0i0o0n', $in_str); $new_str=utf8_decode($new_str); if (strpos($new_str,'?') !== false) { $new_str=$in_str; } else { $new_str = str_replace('q0u0e0s0t0i0o0n', '?', $new_str); } return $new_str;}// Création du socket d'écoute (vers flash)$socketHandler = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ( !$socketHandler ) { fwrite(STDOUT, 'Creation du socket vers le flash [FAILED]'."\n"); fwrite(STDOUT, 'Erreur lors du socket_create : '.socket_strerror($socketHandler)."\n");} else { fwrite(STDOUT, 'Creation du serveur [OK]'."\n");}// Adressage du socketsocket_setopt($socketHandler, SOL_SOCKET, SO_REUSEADDR, 1);$bindRes = socket_bind($socketHandler, FLASH_ADDR, FLASH_PORT);if ( !$bindRes ) { fwrite(STDOUT, 'Erreur lors du socket_bind du flash : '.socket_strerror($bindRes)."\n");} else { fwrite(STDOUT, 'Socket du flash adressé : '."\n");}// Mise en ecoute$listenRes = socket_listen($socketHandler, MAXCONCURRENT);if ( !$listenRes ) { fwrite(STDOUT, 'Erreur lors du socket_listen du flash '."\n");} else { fwrite(STDOUT, 'Socket du flash en écoute '."\n");}// Initialisation des clients flash$maxi = -1;for ($i = 0; $i < MAXCONCURRENT; $i++) { $client[$i] = null; $clientBuff[$i] = '';}// Initialisation des liaison irc$maxi = -1;for ($i = 0; $i < MAXCONCURRENT; $i++) { $irc[$i] = null; $ircBuff[$i] = '';}$h = 0;// Boucle Principalewhile(true) { ++$h; // On recompose le tableau tabSocket // Socket Principal $tabSocket[0] = $socketHandler; // Les clients flash for ($i = 0; $i < MAXCONCURRENT; $i++) { if ($client[$i] != null) { $tabSocket[$i + 1] = $client[$i]; } } // Les liaisons irc for ($i = 0; $i < MAXCONCURRENT; $i++) { if ($irc[$i] != null) { $tabSocket[MAXCONCURRENT + $i] = $irc[$i]; } } // On nettoie les connexion fermees foreach ($tabSocket as $key=>$value) { if (get_resource_type($value)=='Unknown') { unset($tabSocket[$key]); } } // On bloque en attendant une connexion $pret = socket_select($tabSocket, $null = null, $null = null, null); // Si on detecte une nouvelle connexion if (in_array($socketHandler, $tabSocket)) { for ($i=0; $i < MAXCONCURRENT; $i++) { if ($client[$i]==null) { // On se met à l'écoute $client[$i] = socket_accept($socketHandler); socket_setopt($client[$i], SOL_SOCKET, SO_REUSEADDR, 1); socket_getpeername($client[$i], $remote_host[$i], $remote_port[$i]); // On fait une liaison à l'ircd $todisconnect = false; $irc[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if(!$irc[$i]) { $todisconnect = true; } else { $test = socket_connect($irc[$i], IRC_ADDR, IRC_PORT); if(!$test) { $todisconnect = true; } } if ($todisconnect) { // Y'a eut un probleme de connexion irc, on deconnecte le client socket_shutdown($client[$i]); socket_close($client[$i]); $client[$i] = null; unset($remote_host[$i]); unset($remote_port[$i]); } break; } if ($i == MAXCONCURRENT - 1) { echo 'Trop de clients'."\n"; } } if ($i>$maxi) { $maxi = $i; } if (--$pret<=0) { continue; } } // On balaye les clients pour voir si un client a parlé for ($i = 0; $i <= $maxi; $i++) { if ($client[$i]==null) { continue; } if (in_array($client[$i], $tabSocket)) { $buff = trim(socket_read($client[$i], MAXLINE)); if (!$buff) { // On ferme la connexion flash socket_shutdown($client[$i]); socket_close($client[$i]); $client[$i] = null; unset($remote_host[$i]); unset($remote_port[$i]); // On ferme la connexion ircd socket_shutdown($irc[$i]); socket_close($irc[$i]); $irc[$i] = null; } else { // On modifie les < pour que ca passe bien $buff = str_replace('<','<', $buff); // On envoie du flash vers le irc socket_write($irc[$i], $buff."\n"); } } } // On balaye connexionx irc pour voir si un irc a parlé for ($i = 0; $i <= $maxi; $i++) { if ($irc[$i]==null) { continue; } if (in_array($irc[$i], $tabSocket)) { $buff = trim(socket_read($irc[$i], MAXLINE)); if (!$buff) { // On ferme la connexion flash socket_shutdown($client[$i]); socket_close($client[$i]); $client[$i] = null; unset($remote_host[$i]); unset($remote_port[$i]); // On ferme la connexion ircd socket_shutdown($irc[$i]); socket_close($irc[$i]); $irc[$i] = null; } else { // On decode si c'est en utf8 $buff = smart_utf8_decode($buff); // On modifie les < en < $buff = str_replace('<', '<', $buff); // On envoie de irc vers flash $tabout = explode("\r\n", $buff); foreach($tabout as $value) { socket_write($client[$i], $value."\0"); } } } }}// Fermeture du serveursocket_close($socketHandler);?>