我正在使用 NetLink 套接字库 ( https://sourceforge.net/apps/wordpress/netlinksockets/ ),并且我想以我指定的格式通过网络发送一些二进制数据。
我计划的格式很简单,如下:
字节 0 和 1:uint16_t 类型的操作码(即,无符号整数总是 2 个字节长)
字节 2 以后:任何其他必要的数据,例如字符串、整数、每个的组合等。对方将根据操作码解释这些数据。例如,如果操作码为 0,表示“登录”,则此数据将由一个字节整数组成,告诉您用户名的长度,然后是一个包含用户名的字符串,然后是一个包含密码的字符串。对于操作码 1,“发送聊天消息”,此处的整个数据可能只是聊天消息的字符串。
不过,这是该库为我提供的用于发送数据的内容:
void send(const string& data);
void send(const char* data);
void rawSend(const vector<unsigned char>* data);
我假设我想为此使用 rawSend() .. 但是 rawSend() 需要无符号字符,而不是指向内存的 void* 指针?如果我尝试将某些类型的数据转换为无符号字符数组,这里不会丢失一些数据吗?如果我错了,请纠正我。但如果我是对的,这是否意味着我应该查看另一个支持真正二进制数据传输的库?
假设这个库确实符合我的目的,我将如何将我的各种数据类型转换并连接到一个 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);
但是,当我试图解释数据时,在另一端遇到了一些例外情况。我在接近演员阵容时都错了吗?我会通过转换为无符号字符来丢失数据吗?
提前致谢。