5.5 strict warnings, change background color
[php-js-websockets.git] / server.functions.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
120
121
122
123
124
125
126
127
<?php
 
function sendMesageToYou ($socket, $msg, $handshake=false) {
        $msg = $msg;
        echo "[".date('Y-m-d H:i:s')."] MESSAGE to ".intval($socket)." ".$msg.")\n";
        if ( $handshake == false ) {
                @socket_write ($socket, encode($msg));
        } else {
                @socket_write ($socket, $msg, strlen($msg));
        }
}
 
function sendMessageToAll ($allclients, $socket, $session, $msg) {
        global $_sockets;
        foreach ($allclients as $client) {
                if ( $_sockets[intval ($client)]['session'] == $session && intval ($client) != intval ($socket) ) {
                        echo "[".date('Y-m-d H:i:s')."] MESSAGE to ".intval($client)." ".$msg.")\n";
                        @socket_write ($client, encode ($msg));
                }
        }
}
 
function send_Msg($allclients,$socket,$id,$msg) {
        global $_sockets;
 
        if (!empty($_sockets[intval($socket)])) {
                $nicks = array(); //amig fut a parancs ebben vannak a nickek.
 
                foreach ($_sockets as $_socket){
                        foreach ($_socket as $key=>$val){
                                // this check's the onliners
                                if (empty($nicks[$val])) $nicks[$val]=1;
                                else $nicks[$val]=$nicks[$val]+1; // we shouldn't have duplicated nicks, but what if...
                        }
                }
 
                foreach($allclients as $client) {
                        if (!empty($_sockets[$client]['nick']) && ($_sockets[$client]['nick'] == $id)) {
                                $_client = $client;
                                $out = "<msg aid=\"".$_sockets[$socket]['nick']."\" time=\"".date("H:i:s")."\" msg=\"".$msg."\" from=\"".$_sockets[$client]['nick']."\" />";
                        }
                        elseif(empty($nicks[$id])) {
                                //backto the sender
                                $_client = $socket;
                                $out = "<error value=\"User is already left.\"/>";
                        }
                }
        } else {
                //backto the sender
                $_client = $socket;
                $out = "<error value=\"Not identified.\"/>";
        }
        if (!empty($out)) {
                socket_write($socket, $out.chr(0)); //send to back ourself. we have to handle it in flash
                socket_write($_client, $out.chr(0)); //send to the recipient
        }
}
 
 
function dohandshake($socket, $buffer) {
        // Determine which version of the WebSocket protocol the client is using
        if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/ ", $buffer, $match))
            $version = $match[1];
        else
            return false;
 
        if($version >= 8){
            // Extract header variables
            if(preg_match("/GET (.*) HTTP/"   ,$buffer,$match)){ $r=$match[1]; }
            if(preg_match("/Host: (.*)\r\n/"  ,$buffer,$match)){ $h=$match[1]; }
            if(preg_match("/Sec-WebSocket-Origin: (.*)\r\n/",$buffer,$match)){ $o=$match[1]; }
            if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$buffer,$match)){ $k = $match[1]; }
 
            // Generate our Socket-Accept key based on the IETF specifications
            $accept_key = $k . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
            $accept_key = sha1($accept_key, true);
            $accept_key = base64_encode($accept_key);
 
            $upgrade =  "HTTP/1.1 101 Switching Protocols\r\n" .
                            "Upgrade: websocket\r\n" .
                            "Connection: Upgrade\r\n" .
                            "Sec-WebSocket-Accept: $accept_key\r\n\r\n";
 
                echo "[".date('Y-m-d H:i:s')."] Sending handshake)\n";
                sendMesageToYou ($socket, $upgrade, true);
            return true;
        }
        else {
            return false;
        }
}
 
function unmask($payload) {
        $length = ord($payload[1]) & 127;
 
        if($length == 126) {
                $masks = substr($payload, 4, 4);
                $data = substr($payload, 8);
        }
        elseif($length == 127) {
                $masks = substr($payload, 10, 4);
                $data = substr($payload, 14);
        }
        else {
                $masks = substr($payload, 2, 4);
                $data = substr($payload, 6);
        }
 
        $text = '';
        for ($i = 0; $i < strlen($data); ++$i) {
                $text .= $data[$i] ^ $masks[$i%4];
        }
        return $text;
}
 
function encode($text) {
        // 0x1 text frame (FIN + opcode)
        $b1 = 0x80 | (0x1 & 0x0f);
        $length = strlen($text);
 
        if($length <= 125)              $header = pack('CC', $b1, $length);     elseif($length > 125 && $length < 65536)                $header = pack('CCS', $b1, 126, $length);       elseif($length >= 65536)
                $header = pack('CCN', $b1, 127, $length);
 
        return $header.$text;
}
 
?>
comments