解析通过netcat发送的字节 < >我使用C++中的套接字运行服务器。一旦我使用netcat连接到客户端,我就会有一个函数读取客户端发送的内容并尝试解析它

解析通过netcat发送的字节 < >我使用C++中的套接字运行服务器。一旦我使用netcat连接到客户端,我就会有一个函数读取客户端发送的内容并尝试解析它,c++,bash,sockets,netcat,C++,Bash,Sockets,Netcat,结构: 职能: 理想情况下,我应该得到输出为1,但得到0。 另外,如果我将此更改为 echo -n -e '\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000 我得到100分 我不确定我可以修复的字节顺序是否有问题,但在这两种情况下,似乎还有其他问题。问题在于: uint64_t a = htons(st->u); uint32_t b = htons

结构:

职能:

理想情况下,我应该得到输出为1,但得到0。 另外,如果我将此更改为

echo -n -e '\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000
我得到100分

我不确定我可以修复的字节顺序是否有问题,但在这两种情况下,似乎还有其他问题。

问题在于:

uint64_t a = htons(st->u);     
uint32_t b = htons(st->v);
uint32_t c = htons(st->w);
如果您阅读,您将看到htons表示16位整数,htonl表示32位整数。没有适用于64位类型的现有标准函数


但是,在使用GNU C库的Linux上,有一组具有64位变体的函数。

连接两侧的函数是否相等?还请注意,使用当前存在的任何编码,0并不等于“0”。最后,您认为HTON中的s代表什么?答:它的缩写,即16位整数。对于64位类型没有标准的转换函数,但是对于32位整数有标准的转换函数。那么您就不能发送您声称要发送的内容。哪个IMO使整个问题几乎和缺少变量声明(如buf或msghead)的代码一样毫无价值?str的类型是什么?。请学习如何创建,也请阅读。除了您对htons函数的无效使用,除非您重载了它?之外,您可以检查sizeofstr吗?这是你所期望的吗?成员之间没有填充?我已经对此进行了修改。我在stackoverflow本身上为64位变量使用了一个函数,为32位整数使用了htonl。我仍然面临问题。只有最后两个字节被考虑,而那些被交换的也是我上面提到的输入,由netcat发送。\x00\x00\x00\x00\x00\x00\x00\x01为a提供256,如果我对前6个字节做任何更改,如\x00\x00\x11\x00\x00\x00\x00\x01,它仍然保持不变。@rsaw27您的htonll函数。所以问题可能是你可能没有收到所有的数据?您只检查read返回的值是否大于0,但实际上不知道它读取了多少。使用TCP,您可能需要多次调用才能接收所有数据。并尝试打印您实际收到的原始数据?这是你所期望的吗?
uint64_t htonll(uint64_t value)
{
// The answer is 42
static const int num = 42;

// Check the endianness
if (*reinterpret_cast<const char*>(&num) == num)
{
    const uint32_t high_part = htonl(static_cast<uint32_t>(value >> 32));
    const uint32_t low_part = htonl(static_cast<uint32_t>(value & 0xFFFFFFFFLL));

    return (static_cast<uint64_t>(low_part) << 32) | high_part;
} else
{
    return value;
}
}
echo -n -e '\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000
echo -n -e '\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000
uint64_t a = htons(st->u);     
uint32_t b = htons(st->v);
uint32_t c = htons(st->w);