увеличить сокеты read_until для структур - PullRequest
0 голосов
/ 07 марта 2019

Я успешно начал использовать сокет в C ++ и подключился к нему в клиенте Python.Я начал с отправки простых строк и остановки C ++ Boost всякий раз, когда встречался разделитель (в моем случае я использовал

// C++ boost Socket Server
std::string read_socket_command(tcp::socket & socket) {
   boost::asio::streambuf buf;
   boost::asio::read_until( socket, buf, "\n" );
   std::string data = boost::asio::buffer_cast<std::string*>(buf.data());
   return data;
}

http://think -async.com / Asio / boost_asio_1_12_1 / doc / html/boost_asio/overview/core/line_based.html

моя проблема в том, что теперь в клиенте Python я хочу отправить данные в виде структуры, упакованные. Но как мне сказать, чтобы C ++ код остановилсячтение данных?

# Python Client
import struct

DATA_NAME_String = "string int int int long long int int int"
DATA_FORMAT_STRING = "25s I I I I I I I I"


def pack_data(msg):
    debug_print("Packing a message...")
    if type(msg) is SomeCustomType:
        data = ("hi", 22, 1, 4, 457, 42342, 0, 1)
    packer = struct.Struct(DATA_FORMAT_STRING)
    packed_data = packer.pack(*data)
    return packed_data

1 Ответ

3 голосов
/ 07 марта 2019

В ваших упакованных данных пусть первые 4 байта (uint32_t) указывают количество байтов полезной нагрузки. В двух словах при отправке двоичных данных вы должны отправить другой стороне размер заранее. read_until допустимо для текстового протокола, но для двоичных данных вам, вероятно, придется использовать read.

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