0

この質問の仕方はよくわかりませんが、ここに行きます。

したがって、Boost libsのASIOを使用して、TCPソケットを使用してサーバーに接続し、それに特定のメッセージを書き込むと仮定します。

メッセージにはいくつかのユーザーデータが含まれており、次のようになります。1バイト(パケットID)、4バイト(整数)、ユーザーnullで終了する文字列、および6つのゼロバイト(サーバーによって予約されていますが、使用されていません)。

ASIOのboost::asio :: buffer関数で使用するためにそのようなメッセージを組み立てる最も便利な方法は何でしょうか?

私はこの時点で本当に混乱しています。よろしくお願いします。

4

3 に答える 3

2

関数を使用して単一のバッファーを作成する代わりに、構造をバッファーシーケンスasio::buffer()に適合させることができます。つまり、asio関数はそのような概念を受け入れます。この方法で、fixed--null-terminated--null-terminated-fixed-fixed-etc...のようなパターンを送信すると便利です。

于 2012-07-31T11:44:30.630 に答える
1

A.シリアル化できるパケット構造を定義します。

class ISerializable
{
public:
    virtual ~ISerializable(){}

    virtual void serialize(std::ostream& stream) = 0;
};

class LoginPacket : public ISerializable
{
public:
    // Constructor and access functions

    virtual void serialize(std::ostream& stream)
    {
        stream.write((const char*)&packetId, 1);
        stream.write((const char*)&accountId, 4);
        stream.write(username.c_str(), username.size() + 1);
        // Write the unused 6-bytes of zero
        int zero(0);
        stream.write((const char*)&zero, 4);
        stream.write((const char*)&zero, 2);
    }

private:
    unsigned char packetId;
    unsigned int32_t accountId;
    std::string username;
};

B.ここで、このパケットクラスを使用するには、次のようにします。

LoginPacket packet;
// Fill details for the packet
std::stringstream data;
packet.serialize(data);
// Send the data to the network
yourSocket.send(data.str().c_str(), data.str().size());
于 2012-07-31T11:35:28.557 に答える
1

boost :: asio :: buffer()関数は、他の種類のバッファーをasioで使用されるバッファーに適合または変換します。

ある種のアプリケーションバッファを使用し、そのバッファを埋めてから、ワイヤに書き込むためにバッファをasioに渡す必要があります。例えば:

std::vector< char > data;

data.push_back( id );
data.push_back( i & 0xff );
data.push_back( ( i >> 8 ) & 0xff );
data.push_back( ( i >> 16 ) & 0xff );
data.push_back( ( i >> 24 ) & 0xff );

const char* const str = s.c_str();
data.insert( data.end(), str, str + std::strlen( str ) );

for ( int pad = 0; pad != 4; ++pad )
    data.push_back( 0 );

boost::asio::write( socket, boost::asio::buffer( data ) );
于 2012-07-31T11:56:56.297 に答える