为结构提升套接字read_until

问题描述 投票:0回答:1

我已成功开始在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
c++ sockets boost-asio
1个回答
3
投票

在打包数据中,前4个字节(uint32_t)表示有效负载的字节数。简而言之,在发送二进制数据时,您应该预先向另一方发送大小。 read_until对文本协议有效,但对于二进制数据,您可能必须使用read

© www.soinside.com 2019 - 2024. All rights reserved.