PHP читает только 1 байт буфера рукопожатия от клиента C# (WebsocketSharp) - PullRequest
0 голосов
/ 05 марта 2020

Что ж, я пытаюсь подключиться к серверу Websocket, установленному в PHP (https://github.com/napengam/phpWebSocketServer/), с моим клиентом C# (https://github.com/sta/websocket-sharp).

Я делаю это с помощью форка оригинального проекта (https://www.nuget.org/packages/websocket-sharp-customheaders).

Я сделал следующее:

private static void TestWebSocketServer(IWebDriver web)
    {
        WebSocket ws = null;

        try
        {
            ws = new WebSocket("wss://api.z3nth10n.net:8090"); // /web
        }
        catch (SocketException ex)
        {
            Console.WriteLine(ex, Color.Red);
        }

        if (ws != null)
        {
            try
            {
                ws.CustomHeaders = new Dictionary<string, string>
                    {
                        //{ "Accept-Encoding", "gzip, deflate" }, //gzip, deflate, br
                        //{ "Accept-Language", "en;q=0.8,en-GB;q=0.7" },
                        //{ "Cache-Control", "no-cache" },
                        { "Connection", "Upgrade" },
                        { "Host", "api.z3nth10n.net" },
                        { "Origin", "https://api.z3nth10n.net" },
                        //{ "Pragma", "no-cache" },
                        //{ "Sec-WebSocket-Extensions", "permessage-deflate; client_max_window_bits" },
                        //{ "Sec-WebSocket-Key", Convert.ToBase64String(Encoding.UTF8.GetBytes("WebSocket rocks!")) },
                        //{ "Sec-WebSocket-Protocol", "actioncable-v1-json, actioncable-unsupported" },
                        { "Sec-WebSocket-Version", "13" },
                        { "Upgrade", "websocket" },
                        //{ "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" },
                        // { "Get", "web" }
                    };

                ws.OnMessage += (sender, e) =>
                    Console.WriteLine("Message received" + e.Data);

                ws.OnError += (sender, e) =>
                    Console.WriteLine("Error: " + e.Message);

                ws.Connect();
            }
            catch (SocketException ex)
            {
                Console.WriteLine(ex, Color.Red);
            }

            if (ws.IsAlive)
                SendMessage(ws, "Test from C#");

            ws.Close();
        }

        Console.ReadKey(true);
    }

    private static void SendMessage(WebSocket ws, string message, string opcode = "broadcast")
    {
        var dictionary = new Dictionary<string, string>
        {
            {"opcode", opcode},
            {"message", message}
        };

        ws.Send(JsonConvert.SerializeObject(dictionary));
    }

Все Кажется, работает нормально. Но PHP выдает мне следующую ошибку при операции рукопожатия:

[WEBSOCKETSERVER | 2020-03-05 15:27:45.087373018264771] Handshake:G
[WEBSOCKETSERVER | 2020-03-05 15:27:45.087646007537842] Socket 18 - Handshake aborted - [HTTP/1.1 400 Bad Request
HTTP/1.1 426 Upgrade Required
Sec-WebSocketVersion: 13
HTTP/1.1 405 Method Not Allowed]
PHP Fatal error:  Uncaught Error: Call to a member function onError() on string in /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/webSocketServer.php:253
Stack trace:
#0 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/coreFunc.php(130): WebSocketServer->onError()
#1 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/webSocketServer.php(112): WebSocketServer->Handshake()
#2 /var/www/api.z3nth10n.net/discord-bot/examples/phpWebSocketServer/server/runSocketServer.php(92): WebSocketServer->Start()

Просматривая код, я получаю следующую часть:

protected function Handshake($Socket, $Buffer) {
    $this->Log('Handshake:' . $Buffer);
    $addHeader = [];
    $SocketID = intval($Socket);
    $Headers = [];
    $reqResource = [];
    $Lines = explode("\n", $Buffer);
    // ....

ИСТОЧНИК: https://github.com/napengam/phpWebSocketServer/blob/master/server/coreFunc.php#L81

Переменная $Buffer равна "G" ... Итак, я вернулся к коду:

                $Client = $this->Clients[$SocketID];
                if ($Client->Handshake == false) {
                    $dataBuffer = fread($Socket, $this->bufferLength);
                    if ($this->Handshake($Socket, $dataBuffer)) {
                    // ...

SOURCE: https://github.com/napengam/phpWebSocketServer/blob/master/server/webSocketServer.php#L108

Итак, если $this->bufferLength равен 40960, почему моя функция fread читает только строку из 1 байта (G)?

РЕДАКТИРОВАТЬ:

Я проверял соединение с помощью команды netcat. (netcat -p 8090 -l -k -v)

Но, очевидно, я не вижу, что находится на протоколе wss, потому что он защищен шифрованием SSL.

Итак, я попытался подключиться с помощью ws (на клиенте) и получение того, что выводит WebsocketSharp:

listening on [any] 8090 ...
connect to [192.168.x.xx] from 82.red-83-38-189.dynamicip.rima-tde.net [83.38.189.82] 5292
GET / HTTP/1.1
User-Agent: websocket-sharp/1.0
Host: api.z3nth10n.net:8090
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: pUqjINPcgM2hZAu6uKfmnQ==
Sec-WebSocket-Version: 13

Я пытался использовать ws на обоих (клиент и сервер), но не могу, потому что PHP выдает другую ошибку (я постараюсь исправить это).

Таким образом, вся информация отправляется клиентом C#, но в wss отправляется только первый байт.

Существует еще один Javascript клиент (https://github.com/napengam/phpWebSocketServer/blob/master/webClient/socketWebClient.js), и он успешно подключен, это буфер квитирования:

[WEBSOCKETSERVER | 2020-03-05 16:41:30.048753023147583] New client connecting on socket #17
Starting handshake!
/var/www/api.z3nth10n.net/discord-bot-flooder/examples/phpWebSocketServer/server/coreFunc.php:87:
string(547) "GET /web HTTP/1.1
Host: api.z3nth10n.net:8090
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Upgrade: websocket
Origin: https://api.z3nth10n.net
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: _ga=GA1.2.26877450.1574982968
Sec-WebSocket-Key: EEBdJU41neAtetAYvEgj3A==
Sec-WebSocket-Extensions: permessage-"...
[WEBSOCKETSERVER | 2020-03-05 16:41:30.048943996429443] Handshake:GET /web HTTP/1.1
Host: api.z3nth10n.net:8090
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36
Upgrade: websocket
Origin: https://api.z3nth10n.net
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: _ga=GA1.2.26877450.1574982968
Sec-WebSocket-Key: EEBdJU41neAtetAYvEgj3A==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

Итак, Idk, что не так с C# клиентом.

...