Click here to Skip to main content
15,878,809 members
Please Sign up or sign in to vote.
1.11/5 (2 votes)
See more:
I need your help.

Please I need to understand some lines in this code which about handling multiple connections and how they effect the code.

PHP
error_reporting(~E_NOTICE);
set_time_limit (0);

$address = "0.0.0.0";
$port = 5000;
$max_clients = 10;

if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
	$errorcode = socket_last_error();
	$errormsg = socket_strerror($errorcode);

	die("Couldn't create socket: [$errorcode] $errormsg \n");
}

echo "Socket created \n";

// Bind the source address
if( !socket_bind($sock, $address , 5000) )
{
	$errorcode = socket_last_error();
	$errormsg = socket_strerror($errorcode);

	die("Could not bind socket : [$errorcode] $errormsg \n");
}

echo "Socket bind OK \n";

if(!socket_listen ($sock , 10))
{
	$errorcode = socket_last_error();
	$errormsg = socket_strerror($errorcode);

	die("Could not listen on socket : [$errorcode] $errormsg \n");
}

echo "Socket listen OK \n";

echo "Waiting for incoming connections... \n";

//array of client sockets
$client_socks = array();

//array of sockets to read
$read = array();

//start loop to listen for incoming connections and process existing connections
while (true)
{
	//prepare array of readable client sockets
	$read = array();

	//first socket is the master socket
	$read[0] = $sock;

	//now add the existing client sockets
	for ($i = 0; $i < $max_clients; $i++)
	{
		if($client_socks[$i] != null)
		{
			$read[$i+1] = $client_socks[$i];
		}
	}

	//now call select - blocking call
	if(socket_select($read , $write , $except , null) === false)
	{
		$errorcode = socket_last_error();
		$errormsg = socket_strerror($errorcode);

		die("Could not listen on socket : [$errorcode] $errormsg \n");
	}

	//if ready contains the master socket, then a new connection has come in
	if (in_array($sock, $read))
	{
		for ($i = 0; $i < $max_clients; $i++)
		{
			if ($client_socks[$i] == null)
			{
				$client_socks[$i] = socket_accept($sock);

				//display information about the client who is connected
				if(socket_getpeername($client_socks[$i], $address, $port))
				{
					echo "Client $address : $port is now connected to us. \n";
				}

				//Send Welcome message to client
				$message = "Welcome to php socket server version 1.0 \n";
				$message .= "Enter a message and press enter, and i shall reply back \n";
				socket_write($client_socks[$i] , $message);
				break;
			}
		}
	}

	//check each client if they send any data
	for ($i = 0; $i < $max_clients; $i++)
	{
		if (in_array($client_socks[$i] , $read))
		{
			$input = socket_read($client_socks[$i] , 1024);

			if ($input == null)
			{
				//zero length string meaning disconnected, remove and close the socket
				unset($client_socks[$i]);
				socket_close($client_socks[$i]);
			}

			$n = trim($input);

			$output = "OK ... $input";

			echo "Sending output to client \n";

			//send response to client
			socket_write($client_socks[$i] , $output);
		}
	}
}

the lines which I can't understand are:

the first line is $read[0] = $sock; here I can't understand why the coder store the master socket in the read array.

the second line is if (in_array($sock, $read)) here I can't understand how he/she check for a new connection using this line and how he/she check for the master socket if it is exist in the read array while he/she store it already in the read array.

the last line is if (in_array($client_socks[$i] , $read)) here I can't understand why the coder check for the client socket if it is exist in the read array while he/she want to write for it.

thanks every body.
Posted
Updated 17-Jul-14 13:19pm
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900