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);
}
}
}
}
}
?>
DIt probleem staat nu al op 8 forums... Op geen enkele krijg ik er een antwoord op.. Is dit probleem dan iets wat normaal nooit voormkomt ofzo?
2 dingen.
Bumpen mag pas naar 24 uur en je kunt nog geen 3 uur wachten

Ik ben er even overheen gegaan en zie vooral redelijk wat loops. Als je tussendoor wat echo's doet om te zien wat die doet zie je het verloop beter en vindt je meteen je fout.
De computer waar je deamon op draait, heeft deze Windows of een ander besturings systeem?
Loop gewoon je code na en volg handmatig elke mogelijke 'weg' die je code op kan.

Je hebt een true in een while en een foreach.. ik durf haast te wedden dat er een 'pad' is waar ie niet gereset/gedie't/gebreakt wordt.
alles nagelopen... Vind het maar niet... *Word Gek*
Zelfs op deze manier stuurt hij alles dubbel...

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

set_time_limit(0);

ob_implicit_flush();

$address = '192.168.2.3';
$port = 9999;

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 "Client disconnected or lost connection!\n";
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
socket_close($socket);
}elseif (trim($buf) == 'quit') {
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
socket_close($socket);
}elseif (trim($buf) == 'shutdown') {
socket_close($master);
break 2;
}else{
//write enkel deze
$allclients = $read_sockets;
$count = count($allclients);
$count--;
$i = 1;//1 Om de master (0) te vermijden
while($i <= $count) {
$sendvar = "t";
socket_write($allclients[$i], $sendvar);
$i++;
}
}

}

}
}

?>
Je scripje is ieder geval gemaakt voor Linux e.d.

Vervang dit:
socket_read($socket, 2048, PHP_NORMAL_READ)
met dat:
socket_read($socket, 2048)

Laat je deamon luisteren naar 0.0.0.0 dus:
$address = '0.0.0.0';

Daarnaast kan het zijn dat je port al gebruikt word, zelf neem ik altijd port 8888
$port = 8888;


Ik neem aan dat je gewoon de windows telnet client gebruikt?
putty telnet gebruik ik
en ben er achter gekomen dat deze 2 maal uityvoerd
foreach($changed_sockets as $socket) {

Waardoor er ook tweemaal du function om te schrijven word uitgevoerd.
Hierdoor dus de dubbele tekst. Maar hoe kan ik dit oplossen?
"Vervang dit:
socket_read($socket, 2048, PHP_NORMAL_READ)
met dat:
socket_read($socket, 2048)"

Probleme van het dubbel write opgelost.
Enkel write hij nu telkens wat als er een letter word ingetypt in men telnet. Tegen ervoren write hij enkel na dat ik op enter drukte... (een hele zin schreef en danop enter en nu 1 letter en zend dat meteen)

Reageren