]> git.mxchange.org Git - hub.git/blobdiff - contrib/udp-server.php
moved for later merge to master
[hub.git] / contrib / udp-server.php
diff --git a/contrib/udp-server.php b/contrib/udp-server.php
new file mode 100644 (file)
index 0000000..55d58ef
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+$connections = array();
+$first = -1;
+
+require('udp-inc.php');
+
+error_reporting(E_ALL | E_STRICT);
+
+out(__FILE__, __LINE__, 'Opening server port...');
+$socket = stream_socket_server('udp://0.0.0.0:9060', $errno, $errstr, STREAM_SERVER_BIND);
+
+if ((!is_resource($socket)) || ($errno > 0)) {
+       out(__FILE__, __LINE__, $errstr . ' (' . $errno . ')');
+       exit;
+}
+
+if (!stream_set_blocking($socket, FALSE)) {
+       out(__FILE__, __LINE__, 'ERROR: Cannot set non-blocking mode!');
+       exit;
+}
+
+$pkt = '';
+
+out(__FILE__, __LINE__, 'Waiting for connections...');
+
+do {
+       $pkt = trim(stream_socket_recvfrom($socket, 1500, 0, $peer));
+
+       if ($pkt == 'PING') {
+               // Peer in list?
+               if (!isset($connections[$peer])) {
+                       out(__FILE__, __LINE__, 'New peer ' . $peer . ' detected.');
+                       $connections[$peer] = 1;
+               } elseif ($connections[$peer] == 0) {
+                       out(__FILE__, __LINE__, 'Peer ' . $peer . ' has returned.');
+                       $connections[$peer] = 1;
+               }
+
+               //out(__FILE__, __LINE__, 'Sending data to peer ' . $peer . '.');
+               stream_socket_sendto($socket, (time() . ':md5=' . md5(time())), 0, $peer);
+       } elseif ($pkt == 'BYE') {
+               // Peer in list?
+               if (!isset($connections[$peer])) {
+                       out(__FILE__, __LINE__, 'Peer ' . $peer . ' is NOT in peer list.');
+               } else {
+                       out(__FILE__, __LINE__, 'Peer ' . $peer . ' is leaving us.');
+                       stream_socket_sendto($socket, 'BYE', 0, $peer);
+                       $connections[$peer] = 0;
+               }
+       } elseif (!empty($peer)) {
+               out(__FILE__, __LINE__, 'Invalid packet ' . $pkt . ' from peer ' . $peer . '.');
+               stream_socket_sendto($socket, 'INVALID', 0, $peer);
+       } else {
+               // Waiting for packages
+               $pkt = '';
+       }
+
+       $test = (round(date('s', time()) / 10));
+       if ($first != $test) {
+               out(__FILE__, __LINE__, count($connections) . ' total connections so far.', true);
+               $first = $test;
+       }
+
+       // Sleep a little
+       if (function_exists('time_nanosleep')) time_nanosleep(0, 500000);
+} while ($pkt !== FALSE);
+
+?>