From f449edcd846c3db81630b3ed47954ccd956f0f53 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Sat, 14 Feb 2009 23:47:57 +0000 Subject: [PATCH] Example UDP server/client scripts added (license: see comments on online-documentation on www.php.net) --- .gitattributes | 3 ++ chat-server.php | 16 ++++--- udp-client.php | 123 ++++++++++++++++++++++++++++++++++++++++++++++++ udp-inc.php | 13 +++++ udp-server.php | 30 ++++++++++++ 5 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 udp-client.php create mode 100644 udp-inc.php create mode 100644 udp-server.php diff --git a/.gitattributes b/.gitattributes index 71e36d256..9d4d1ecd8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -27,3 +27,6 @@ docs/THANKS -text /package.sh -text /pdepend.sh -text /rebuild_doc.sh -text +/udp-client.php -text +/udp-inc.php -text +/udp-server.php -text diff --git a/chat-server.php b/chat-server.php index 8c0afd8f1..f228f9a0e 100644 --- a/chat-server.php +++ b/chat-server.php @@ -1,6 +1,10 @@ 0) { // create a copy, so $clients doesn't get modified by socket_select() @@ -49,7 +53,7 @@ while (count($clients) > 0) { "There are ".(count($clients) - 1)." client(s) connected to the server\n"); socket_getpeername($new_sock, $ip); - print "[".date("m/d/Y:H:i:s", time())."]:New client connected: {$ip}\n"; + out(__FILE__, __LINE__, "[".date("m/d/Y:H:i:s", time())."]:New client connected: {$ip}"); // Notify all chatter if (count($clients) > 2) { @@ -80,7 +84,7 @@ while (count($clients) > 0) { // remove client for $clients array $key = array_search($read_sock, $clients); unset($clients[$key]); - print "[".date("m/d/Y:H:i:s", time())."]:Client from {$ip} disconnected. Left: ".(count($clients) - 1)."\n"; + out(__FILE__, __LINE__, "[".date("m/d/Y:H:i:s", time())."]:Client from {$ip} disconnected. Left: ".(count($clients) - 1).""); // Notify all chatter if (count($clients) > 1) { @@ -99,7 +103,7 @@ while (count($clients) > 0) { } elseif (in_array(trim($data), $shutdown)) { // Is he allowed to shutdown? if (!in_array($ip, $masters)) { - print "[".date("m/d/Y:H:i:s", time())."]:Client $ip has tried to shutdown the server!\n"; + out(__FILE__, __LINE__, "[".date("m/d/Y:H:i:s", time())."]:Client $ip has tried to shutdown the server!"); socket_write($read_sock, "Server: You are not allowed to shutdown the server!\n"); $data = ""; continue; @@ -147,11 +151,11 @@ while (count($clients) > 0) { socket_write($read_sock, "\nServer: Message accepted.\n"); } elseif ($tags != $data) { // HTML codes are not allowed - print "[".date("m/d/Y:H:i:s", time())."]:Client $ip has entered HTML code!\n"; + out(__FILE__, __LINE__, "[".date("m/d/Y:H:i:s", time())."]:Client $ip has entered HTML code!"); socket_write($read_sock, "Server: HTML is forbidden!\n"); } elseif ((count($clients) == 2) && ($read_sock != $main_sock)) { // No one else will hear the "chatter" - print "[".date("m/d/Y:H:i:s", time())."]:Client $ip speaks with himself.\n"; + out(__FILE__, __LINE__, "[".date("m/d/Y:H:i:s", time())."]:Client $ip speaks with himself."); socket_write($read_sock, "Server: No one will hear you!\n"); } } // end of reading foreach diff --git a/udp-client.php b/udp-client.php new file mode 100644 index 000000000..a8c21b9b0 --- /dev/null +++ b/udp-client.php @@ -0,0 +1,123 @@ + 0)) { + echo "ERROR: $errno - $errstr\n"; + exit; +} + +if (!stream_set_blocking($client, 0)) { + echo "ERROR: Cannot set non-blocking mode!\n"; + exit; +} + +out(__FILE__, __LINE__, "Starting test..."); +while (!feof($client)) { + //out(__FILE__, __LINE__, "Sending ping..."); + fwrite($client, "PING"); + + //out(__FILE__, __LINE__, "Reading reply..."); + $read = trim(fread($client, 50)); + if (empty($read)) { + $failed++; + out(__FILE__, __LINE__, "Empty line received. Is the server there?"); + } elseif ($read == "INVALID") { + $failed++; + out(__FILE__, __LINE__, "Server has not accepted our message."); + } else { + $failed = 0; + //out(__FILE__, __LINE__, "Response ${read} received."); + } + + if ($failed == constant('MAX_FAILURES')) { + out(__FILE__, __LINE__, "Too many failures! (failed=${failed})"); + break; + } elseif ($failed < constant('MAX_FAILURES')) { + continue; + } + + $rec = explode(":", $read); + + $time = $rec[0]; + $right = explode("=", $rec[1]); + $hash = $right[1]; + $hasher = $right[0]; + + if (validate($time) != $hash) { + out(__FILE__, __LINE__, "Invalid: ${read}/{$hash}"); + $invalid++; + continue; + } + + if (!isset($data[$rec[0]])) { + if (count($data) > 0) { + echo $data[$rec[0]-1]."\n"; + $cnt++; + if ($cnt > constant('ROUNDS')) break; + } + $data[$rec[0]] = 0; + } + $data[$rec[0]]++; +} + +array_shift($data); + +stream_socket_shutdown($client, STREAM_SHUT_RDWR); + +$avg = 0; +$min = 0; +$max = 0; + +foreach ($data as $cnt) { + if ($cnt > $max) { + $max = $cnt; + } + if (($cnt < $min) || ($min == 0)) { + $min = $cnt; + } + $avg += $cnt; +} + +if (count($data) > 0) { + $avg = round($avg / count($data)); +} + +out(__FILE__, __LINE__, "MIN/AVG/MAX=${min}/${avg}/${max}"); +out(__FILE__, __LINE__, "INVALID=${invalid}"); + +?> diff --git a/udp-inc.php b/udp-inc.php new file mode 100644 index 000000000..b92a35c07 --- /dev/null +++ b/udp-inc.php @@ -0,0 +1,13 @@ + diff --git a/udp-server.php b/udp-server.php new file mode 100644 index 000000000..b52609264 --- /dev/null +++ b/udp-server.php @@ -0,0 +1,30 @@ + 0)) { + die("$errstr ($errno)\n"); +} + +$pkt = ""; + +out(__FILE__, __LINE__, "Waiting for clients..."); + +do { + $pkt = stream_socket_recvfrom($socket, 50, 0, $peer); + //out(__FILE__, __LINE__, "Received packet ${pkt} from peer ${peer}."); + + if (trim($pkt) == "PING") { + //out(__FILE__, __LINE__, "Sending data to peer ${peer}."); + stream_socket_sendto($socket, (time().":md5=".md5(time())), 0, $peer); + } else { + out(__FILE__, __LINE__, "Invalid packet ${pkt} from peer ${peer}."); + stream_socket_sendto($socket, "INVALID", 0, $peer); + } +} while ($pkt !== false); + +?> -- 2.39.5