--- /dev/null
+<?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);
+
+?>