nachdem ich mich jetzt mal ein bisschen mit PHP und Sockets beschäftigt habe, will ich meine erkenntnisse doch mal "unters volk bringen".
nachfolgendes script stellt einen proxy server da. dieser server hört auf anfragen auf einer ihm genannten adresse und port.
wie gesagt, es ist ein HTTP-Server, das heißt er wertet anfragen eines clients (ein programm das ihn über die adresse und port kontaktiert) als HTTP-Header und versucht eine anfrage an die spezifizierte seite durchzuführen. damit das funktioniert, muss im browser als proxy folgendes eingetragen werden (dies sind die standard einstellungen des scripts):
(proxy einrichten für versch. browser bzw. proxy einrichten für verschiedene browser2
anschließend muss der server aufgerufen werden. am besten tut ihr dies über die kommandozeile, hier ein kleines batchscript für windows:
dazu legt ihr eine leere textdatei an, kopiert das darein, passt die pfade an, und benennt das ganze in "proxy.bat" um. doppelklick drauf und fertig. nun wartet der server auf anfragen des browser. erfolgt eine anfrage, gibt er die anfrage header aus und gibt die internetseite (wenn vorhanden) zurück.
so aber nun zum script (warnung beachten!)
WICHTIG: der server läuft in einer ENDLOSSCHLEIFE (er hört nie auf)! also muss er von hand beendet werden!
da das ganze als tutorial geplant ist, werd ich morgen noch eine dokumentation posten....
gruß
nachfolgendes script stellt einen proxy server da. dieser server hört auf anfragen auf einer ihm genannten adresse und port.
wie gesagt, es ist ein HTTP-Server, das heißt er wertet anfragen eines clients (ein programm das ihn über die adresse und port kontaktiert) als HTTP-Header und versucht eine anfrage an die spezifizierte seite durchzuführen. damit das funktioniert, muss im browser als proxy folgendes eingetragen werden (dies sind die standard einstellungen des scripts):
Adresse: 127.0.0.1
Port: 3124
Port: 3124
anschließend muss der server aufgerufen werden. am besten tut ihr dies über die kommandozeile, hier ein kleines batchscript für windows:
Code:
start c:\pfad\zu\php.exe c:\pfad\zum\serverscript.php
so aber nun zum script (warnung beachten!)
WICHTIG: der server läuft in einer ENDLOSSCHLEIFE (er hört nie auf)! also muss er von hand beendet werden!
PHP-Code:
<?php
error_reporting(E_ALL|E_STRICT);
set_time_limit(0);
ob_implicit_flush();
$socket=new socket('127.0.0.1',3124);
try
{
$socket->persistent();
}
catch(Exception $e)
{
echo $e->getMessage();
}
class socket
{
public $address;
public $port;
private $socket;
private $socket_bind;
private $socket_listen;
private $socket_connection;
private $url='www.google.de';
private $request_headers;
public function __construct($adress,$port)
{
$this->address=$adress;
$this->port=$port;
}
public function create_bind_listen()
{
$this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if($this->socket===FALSE)
{
throw new Exception('socket_create '.socket_strerror(socket_last_error()),socket_last_error());
return FALSE;
}
socket_set_option($this->socket,SOL_SOCKET,SO_REUSEADDR,1);
$this->socket_bind=socket_bind($this->socket,$this->address,$this->port);
if($this->socket_bind===FALSE)
{
throw new Exception('socket_bind '.socket_strerror(socket_last_error()),socket_last_error());
return FALSE;
}
$this->socket_listen=socket_listen($this->socket,5);
if($this->socket_listen===FALSE)
{
throw new Exception('socket_listen '.socket_strerror(socket_last_error()),socket_last_error());
return FALSE;
}
}
public function persistent()
{
$this->create_bind_listen();
echo 'Erwarte Verbindung'."\n";
do
{
$this->socket_connection=socket_accept($this->socket);
if($this->socket_connection===FALSE)
{
throw new Exception('socket_accept '.socket_strerror(socket_last_error()),socket_last_error());
break;
}
socket_set_option($this->socket,SOL_SOCKET,SO_KEEPALIVE,1);
if(FALSE===($this->request_headers=socket_read($this->socket_connection,10000,PHP_BINARY_READ)))
{
throw new Exception('socket_read '.socket_strerror(socket_last_error()),socket_last_error());
break 2;
}
echo $this->request_headers;
$this->parse_headers($this->request_headers);
$this->make_request($this->url);
socket_close($this->socket_connection);
}
while(TRUE);
}
public function parse_headers($headers)
{
$headers=explode("\n",$headers);
$this->url=array_shift($headers);
$this->url=explode(' ',$this->url);
$this->url=$this->url[1];
}
public function make_request($url)
{
$url=trim($url);
$page='';
if(substr($url,0,7)!=='http://') $url='http://'.$url;
$internet_connection=fopen($url,'r'); //fsockopen($url,80,$errno,$errstr,30);
if($internet_connection===FALSE) $page='HTTP Status Code: HTTP/1.1 404 Not found';
else
{
stream_set_blocking($internet_connection,0);
fwrite($internet_connection,$this->request_headers);
usleep(1000);
while(!feof($internet_connection))
{
$page.=fgets($internet_connection,8192);
}
fclose($internet_connection);
}
socket_write($this->socket_connection,$page,strlen($page));
}
public function __destruct()
{
@socket_close($this->socket_connection);
@socket_close($this->socket);
}
}
?>
gruß
Kommentar