5.5 strict warnings, change background color
[php-js-websockets.git] / server.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/php -q
<?php
 
set_time_limit(0);
ob_implicit_flush();
 
$dir = dirname(__FILE__);
chdir ($dir);
$root     = $dir."/";
 
require ($root."server.functions.php");
 
$address = '192.168.0.2';
$port = 10001;
 
$_sockets = array();
 
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";
} else {
        $started=time();
        echo "[".date('Y-m-d H:i:s')."] SERVER CREATED ( MAXCONN:".SOMAXCONN." ) \n";
        echo "[".date('Y-m-d H:i:s')."] Listening on ".$address.":".$port."\n";
}
 
$read_sockets = array ($master);
 
while (true) {
        $changed_sockets = $read_sockets;
        $num_changed_sockets = socket_select($changed_sockets, $write, $except, 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);
                                echo "[".date('Y-m-d H:i:s')."] CONNECTED "."(".count($read_sockets)."/".SOMAXCONN.")\n";
                        }
                } else {
                        $bytes = @socket_recv ($socket, $buffer, 2048, 0);
 
                        if (strlen($buffer) == 0) {
                                //we get the user's unique id from the database
                                $id = $_sockets[intval($socket)]['session'];
 
                                $index = array_search ($socket, $read_sockets);
 
                                unset ($read_sockets[$index]); // we clean up
                                unset ($_sockets[intval($socket)]); // we clean up our own data
                                // cleaning up is essential when creating a daemon
                                // we can't leave junk in the memory
                                @socket_shutdown ($socket, 2);
                                @socket_close ($socket);
                        } else {
                                $session = $_sockets[intval($socket)]['session'];
                                $allclients = $read_sockets;
                                array_shift ($allclients);
 
                                if ( !$_sockets[intval($socket)]['handshake'] ) {
                                        $_sockets[intval($socket)]['handshake'] = true;
                                        dohandshake($socket, $buffer);
                                }
 
                                $buffer = unmask($buffer);
                                //echo "[".date('Y-m-d H:i:s')."] BUFFER ".$buffer."\n";
                                $piece = explode("|",trim($buffer)); // we strip out all unwanted data
                                $cmd = strtolower ($piece[0]);
 
                                if ( !empty($piece[1]) ) {
                                        $txt = $piece[1];
                                }
 
                                echo "[".date('Y-m-d H:i:s')."] Received ".$cmd." ".$txt."\n";
 
                                switch ($cmd) {
                                        case "chat": // chat|session:message
                                                if ( $session ) {
                                                        $txt = explode (":", $txt);
                                                        //$session = $txt[0];
                                                        $message = $txt[0];
                                                        //if ( $_sockets[intval($socket)]['session'] == $session ) {
                                                                //sendMesageToYou ($socket, $message);
                                                                sendMessageToAll ($allclients, $socket, $session, $message);
                                                        //}
                                                } else {
                                                        sendMesageToYou ($socket, "wrong session");
                                                }
                                        break;
 
                                        case "login"; // login|session
                                                $txt = explode (":", $txt);
                                                $session = $txt[0];
 
                                                $_sockets[intval($socket)]['session'] = $session;
                                                sendMesageToYou ($socket, "true");
                                        break;
 
                                        case "ping":
                                                sendMesageToYou ($socket, "PONG");
                                        break;
                                }
                        }
                }
        }
}
 
?>
comments