NetLinkソケットライブラリ(https://sourceforge.net/apps/wordpress/netlinksockets/)を使用していて、指定した形式でネットワーク経由でバイナリデータを送信したいと考えています。
私が計画したフォーマットは非常に単純で、次のとおりです。
バイト0および1:タイプuint16_tのオペコード(つまり、符号なし整数は常に2バイト長)
バイト2以降:文字列、整数、それぞれの組み合わせなど、必要なその他のデータ。相手方は、オペコードに従ってこのデータを解釈します。たとえば、「ログイン」を表すオペコードが0の場合、このデータは、ユーザー名の長さを示す1バイト整数、ユーザー名を含む文字列、パスワードを含む文字列で構成されます。オペコード1「チャットメッセージを送信する」の場合、ここのデータ全体はチャットメッセージの単なる文字列である可能性があります。
ただし、ライブラリがデータを送信するために使用できるものは次のとおりです。
void send(const string& data);
void send(const char* data);
void rawSend(const vector<unsigned char>* data);
これにはrawSend()を使用したいと思いますが、rawSend()は、メモリへのvoid *ポインタではなく、unsigned charsを取りますか?特定のタイプのデータをunsignedcharの配列にキャストしようとすると、ここでデータがいくらか失われることはありませんか?私が間違っている場合は訂正してください。しかし、私が正しい場合、これは、実際のバイナリデータ転送をサポートしている別のライブラリを調べる必要があることを意味しますか?
このライブラリが私の目的を果たしていると仮定すると、さまざまなデータ型を1つのstd :: vectorにキャストして連結するにはどうすればよいでしょうか?私が試したのは次のようなものです。
#define OPCODE_LOGINREQUEST 0
std::vector<unsigned char>* loginRequestData = new std::vector<unsigned char>();
uint16_t opcode = OPCODE_LOGINREQUEST;
loginRequestData->push_back(opcode);
// and at this point (not shown), I would push_back() the individual characters of the strings of the username and password.. after one byte worth of integer telling you how many characters long the username is (so you know when the username stops and the password begins)
socket->rawSend(loginRequestData);
ただし、データを解釈しようとしたときに、いくつかの例外が発生しました。キャスティングに近づいていますか?unsigned charsにキャストするとデータが失われますか?
前もって感謝します。