我正在制作一个游戏,程序会自动广播用户在线。广播消息将由以下内容组成:
1.字节:0到6之间的值
2-5.byte:rgba颜色
6-。。。字节:用户名
前5个字节存储在char buf_begin
中,而用户名存储在std::string username
中。
我试过这个:
std::string buf_begin_s(buf_begin);
std::string buf = buf_begin_s + username;
sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to));
问题是buf
字符串不包含1-5。字节,只有用户名。
std::string buf_begin_s(buf_begin);
如果,正如您所说,buf_begin
是一个5个字符的缓冲区,并且第一个字符可能是0,那么当它是0时,buf_begin_s
最终会变成一个空字符串。此构造函数需要一个以' '
字符结尾的C样式字符串。如果buf
中的第一个字符是0字节,那么这将是故事的结束。
如果缓冲区中的5个字符中没有一个是0,这将导致未定义的行为,因为构造函数在内存中查找' '
字节。
这可能是:
std::string buf_begin_s(buf_begin, buf_begin+5);
sendto()
调用也是错误的:
sendto(udp_br, buf.c_str(), sizeof(buf.c_str()), 0, (sockaddr *)&to, sizeof(to));
由于buf.c_str()
是const char *
,第三个参数将是sizeof(const char *)
,或者4或8,这取决于这是32位平台还是64位平台。无论buf
中有多少,sizeof(buf.c_str())
总是4或8。这显然是错误的。
这应该只是buf.size()
。