Socket Server ertellen

ArtusPendragon

Grünschnabel
Hallo

ich suche ein script beispiel für einen Funktionierenden Socket server in PHP.

Dieser solte mehere verbindungen gleichzeitig verarbeiten können.

Er soll befehle entgegen nehmen, die anahme bestätigen und dann die verbindung zum client trennen.

Dieser hier macht schon fast das was ich will. Er nimmt mehrere verbindungen an aber bestätigt den erhalt nicht und schliest die verbindung nicht automatisch.

PHP:
#!/usr/local/bin/php -q

<?php
$ipaddress = '192.168.1.1';

$port = 31339;

// Ressourcen-arrays definieren

$readSocks = array();

// write und exception sockets werden in diesem script nicht benötigt

$writeSocks = null;

$exceptSocks = null;

// hier kommen alle neuen socket-verbindungen mit den clients hinein

$clients = array();

// erzeugen des sockets mittels socket_create()

$socket = socket_create(AF_INET, SOCK_STREAM, 0);

if ($socket === false) {

die('Fehler beim erzeugen des Sockets! Grund: ' . socket_strerror($socket) . "\n");

}

// socket an gegebene IP-Addresse und port binden.

if (($ret = socket_bind($socket, $ipaddress, $port)) === false) {

die('Fehler beim Binden des Sockets! Grund: ' . socket_strerror($ret) . "\n");

}

// auf dem socket auf einkommende verbindungen warten

if (($ret = socket_listen($socket, 5)) === false) {

die('Fehler beim lauschen auf dem Socket! Grund: ' . socket_strerror($ret) . "\n");

}

// einkommende Verbindung annehmen.

while (true) {

// der hauptsocket gehört ebenfalls zu den lesesockets

$readSocks = array();

$readSocks[] = $socket;



foreach($clients as $clientSock) {

$readSocks[] = $clientSock;

}

if (false === ($num_changed = socket_select($readSocks, $writeSocks, $exceptSocks, 0))) {

die('Fehler bei socket_select! Grund:' . socket_strerror(socket_last_error()) . "\n");

} elseif ($num_changed > 0) {

if (in_array($socket, $readSocks)) {

// Wenn unser socket immer noch in den lesesockets ist, hat

// ein neuer connect stattgefunden

if (($newsocket = socket_accept($socket)) === false) {

die('Fehler beim akzeptieren der Verbindung! Grund:' . socket_strerror($newsocket) . "\n");

} else {

// neuen client in die liste aller clienten aufnehmen

$clients[] = $newsocket;

}

}



foreach ($clients as $clientSock) {

if (in_array($clientSock, $readSocks)) {

// Ein Client hat uns daten geschickt.

$buffer = socket_read($clientSock, 2048);

if (!$buffer = trim($buffer)) {

// Verbindung wurde von der gegenpartei beendet.

socket_shutdown($clientSock);

socket_close($clientSock);

$key_index = array_keys(array_keys($clients), $clientSock);

array_splice($clients,$key_index[0]);

break;

}

if ($buffer == 'quit') {

// Verbindung möchte von der gegenstelle beendet werden.

socket_shutdown($clientSock);

socket_close($clientSock);

$key_index = array_keys(array_keys($clients), $clientSock);

array_splice($clients,$key_index[0]);

break;

} else {

// Normale nachricht

echo 'Nachricht von ' . $clientSock . ': ' . $buffer . "\n";

}

}

}

}

}

// Socket vor dem beenden schliessen

socket_shutdown($socket);

socket_close($socket);
?>

ich will so ne art aplication server erstellen der über ein Webinterface aufgaben in gegen nimmt und diese dann abarbeitet. Die aufgaben sollen mittels XML übergeben werden.

leider komm ich da gerade ned weiter, hab zwar schon einige anleitungen gelesen aber ihrgendwie ist mir das gerade zu hoch.
 
Hi,

ich habe vor längerer Zeit einen Socks v4 Server in PHP geschrieben ...
1. ist sehr optimierungsbedürftig
kann aber mehrere Verbindungen verarbeiten. Bei meinem Root-Server bekomme ich sogar noch download-Raten von 1,6MB/s ;) Obwohl der Code caotisch und schlimm ist, ist er relativ schnell. Vllt. kannst du was damit anfangen:
PHP:
<?php
error_reporting (E_ALL);
ob_implicit_flush(true);
set_time_limit (0);
ignore_user_abort(TRUE);

$mySock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if(!$mySock)
{
	die("socket_create() error!");
}

socket_bind($mySock, "0.0.0.0", 1388) or die("socket_bind() error!");
socket_listen($mySock, 3) or die("socket_listen() error!");

$in1 = true;

while($in1)
{
	$cSock = socket_accept($mySock);    
	$buff = socket_read($cSock, 1024, PHP_BINARY_READ);
	$msg = $buff;
	$data = bin2hex($msg);
	$v  = (int) hexdec(substr($data, 0, 2));
	$m  = (int) hexdec(substr($data, 2, 2));
	$p  = (int) hexdec(substr($data, 4, 4));
	$ip1 = substr($data, 8, 2);
	$ip2 = substr($data, 10, 2);
	$ip3 = substr($data, 12, 2);
	$ip4 = substr($data, 14, 2);
	$userid = substr($data, 16, strlen($data)-15);
	
	$tSock = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
	echo $data.' ------ '.hexdec($ip1).'.'.hexdec($ip2).'.'.hexdec($ip3).'.'.hexdec($ip4).':'.$p;
	if((socket_connect($tSock, hexdec($ip1).'.'.hexdec($ip2).'.'.hexdec($ip3).'.'.hexdec($ip4), $p)) === FALSE)
	{	  
		socket_close($tSock);
		socket_close($cSock);
	}
	else
	{
		$msg = pack("xvxxxxxx", 0x5A);
		socket_write($cSock, $msg, 8);
		
		handle_clients($cSock, $tSock, $mySock);
	}
	$in1 = false;
}
socket_close($mySock);            

function handle_clients($tSock, $cSock, $mySock)
{
	$mySocks = array($tSock, $cSock, $mySock);
	$in2 = true;
	while($in2)
	{
		$readSocks = $mySocks;
		if(FALSE === ($aSock = socket_select($readSocks, $write = NULL, $except = NULL, 0)))
		{
			$in2 = false;
		}
		else
		{
			if($aSock > 0)
			{
				foreach($readSocks as $sock)
				{
					if($sock == $mySock)
					{
						$scSock = socket_accept($sock);    
						$sbuff = socket_read($scSock, 10240, PHP_BINARY_READ);
						$smsg = $sbuff;
						$sdata = bin2hex($smsg);
						$sv  = (int) hexdec(substr($sdata, 0, 2));
						$sm  = (int) hexdec(substr($sdata, 2, 2));
						$sp  = (int) hexdec(substr($sdata, 4, 4));
						$sip1 = substr($sdata, 8, 2);
						$sip2 = substr($sdata, 10, 2);
						$sip3 = substr($sdata, 12, 2);
						$sip4 = substr($sdata, 14, 2);
						$suserid = substr($sdata, 16, strlen($sdata)-16);
					
						$stSock = socket_create (AF_INET, SOCK_STREAM, SOL_TCP) or die("");
						if(($ret = socket_connect ($stSock, hexdec($sip1).'.'.hexdec($sip2).'.'.hexdec($sip3).'.'.hexdec($sip4), $sp)) === FALSE)
						{
							socket_close($scSock);
						}
						else
						{
							$smsg = pack("xvxxxxxx", 0x5A);
							socket_write($scSock, $smsg, 8);
							
							handle_clients($scSock, $stSock, $mySock);
						}
					}
					else
					{
						if (FALSE === ($bytes = socket_recv($sock, $buff, 10240, 0)))
						{
				            $in2 = false;
				        }
				        else
				        {   
				        	if($buff == NULL || $bytes == 0)
				        	{ 
								$in2 = false;
				        	}
				        	else
				        	{
								if($sock == $tSock)
								{
									socket_write($cSock, $buff, strlen($buff));
								}                                   
								else
								{                                             
									socket_write($tSock, $buff, strlen($buff));
								}
							}
						}
					}
				}
			}
		}
	}
	socket_close($cSock);
	socket_close($tSock);
}
?>



MfG
 
Zurück