All pastes #451037 Raw Edit

Untitled

public php v1 · immutable
·published 2007-04-21 06:33 UTC
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('&lt;','<', $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 &lt;				$buff = str_replace('<', '&lt;', $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);?>