Its always sending 2 times test to everyone.. Why? I want him to send it only once to all of them...
Zend altijd naar elke client twee keer test in plaats van 1 maal... Waarom?


#!/usr/bin/php -q
<?php
error_reporting(E_ALL);

set_time_limit(0);
ob_implicit_flush();

$address = '192.168.2.3';
$port = 8888;

function handle_client($allclient) {//write to all
foreach($allclient as $client) {
socket_write($client, "test"); /////////////////////////////////////////////////////////////////////////He is sending "test" 2times why?

}
}

if (($master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($master) . "\n";
}

socket_set_option($master, SOL_SOCKET,SO_REUSEADDR, 1);

if (($ret = socket_bind($master, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}

if (($ret = socket_listen($master, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
}

$read_sockets = array($master);

while (true) {
$changed_sockets = $read_sockets;
$num_changed_sockets = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
foreach($changed_sockets as $socket) {
if ($socket == $master) {
if (($client = socket_accept($master)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
continue;
} else {
array_push($read_sockets, $client);
}
} else {
if (false === ($buf = socket_read($socket, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
socket_close($socket);
} else {
if (!$buf = trim($buf));
if ($buf == 'quit') {
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
socket_close($socket);
}elseif ($buf == 'shutdown') {
socket_close($master);
break 2;
}else{
//write enkel deze
$allclients = $read_sockets;
array_shift($allclients); // remove master
handle_client($allclients);
}
}
}
}
}
?>
Welkom bij de wereld van Windows. Je zult het dus moeten aan pakken in je deamon, denk dus aan zo iets:

<?php
// Add some while loops and connection stuff here.
$buf = socket_read($socket, 1024);

// Confirm if the client has pressed the enter button:
if(eregi("\r", $buf)) {
switch(trim($client_input_buffer)) {
case 'quit';
// Some quit PHP code.
break;
case 'foobar':
// Do some foobar.
break;
}
// Clean the input buffer so we can receive new commands:
$client_input_buffer = NULL;
continue;
// If the client did not press the enter button:
} else {
$client_input_buffer .= $temp;
continue;
}

?>

Natuurlijk werkt dit stukje code niet zonder enige aanpassing. Daarnaast werkt hij alleen als er maar een client verbinding heeft met het script. Ik weet niet hoe goed je kennis in PHP is?

Reageren