Websocket Hybi-17 новый формат данных C ++ - PullRequest
2 голосов
/ 07 декабря 2011

Протокол Websocket полностью изменился с версии 8. Теперь входящие сообщения из браузера имеют совершенно другой формат, и для меня это действительно сложно.

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

Вот что я нашел из http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17

Кто-нибудь знает, как реализовать чтение на стороне сервера в c ++ или c #? Или у вас есть ссылка на пример, который уже работает?

Я знаю, что этот сервер правильный, но мне нужен код: http://websocket.org/echo.html

Ответы [ 2 ]

3 голосов
/ 06 мая 2016

Здесь есть отличная библиотека C ++ WebSocket, которая поддерживает hybi-17 (последняя версия), только для заголовков и использует только boost.Он поставляется с примером кода и документацией: http://vinniefalco.github.io/

Вот полная программа, которая отправляет сообщение на эхо-сервер:

#include <beast/websocket.hpp>
#include <beast/buffers_debug.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    // Normal boost::asio setup
    std::string const host = "echo.websocket.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::query{host, "80"}));

    using namespace beast::websocket;

    // WebSocket connect and send message using beast
    stream<boost::asio::ip::tcp::socket&> ws(sock);
    ws.handshake(host, "/");
    ws.write(boost::asio::buffer("Hello, world!"));

    // Receive WebSocket message, print and close using beast
    beast::streambuf sb;
    opcode op;
    ws.read(op, sb);
    ws.close(close_code::normal);
    std::cout <<
        beast::debug::buffers_to_string(sb.data()) << "\n";
}
1 голос
/ 07 декабря 2011

Я написал C ++ сервер . См. WsProtocol80::Read() о том, как читать сообщения hybi-17. Обратите внимание, что сервер использует пользовательские классы строк и сокетов, поэтому его было бы нетривиальным для повторного использования, но вы должны иметь возможность легко следить за тем, какие данные читаются / записываются.

Не стесняйтесь задавать любые вопросы о конкретных частях кода.

Этот пост вики также может представлять интерес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...