解析通过netcat发送的字节

时间:2018-07-28 21:09:30

标签: c++ bash sockets netcat

我正在使用C ++中的套接字来运行服务器。连接到客户端后(使用netcat),我就有了一个读取客户端发送的内容并尝试对其进行解析的函数。

结构

struct m
{
           uint8_t m1;
}

struct str
{
           uint64_t a;    
           uint32_t b;
           uint32_t c;
}

功能

 int f(int x){
 char s[1024];
 if (read(x,s,sizeof(s)-1) > 0){
      m *msg = reinterpret_cast<m *>(s);
      if(msg->m1 == 0)
          {
           str *st = reinterpret_cast<str *>(s+1);
           uint64_t a = htonll(st->u);     
           uint32_t b = htonl(st->v);
           uint32_t c = htonl(st->w);
           std::cout<<a<<" "<<b<<" "<<c<<std::endl;
          }
  else
  {....
  }
}

修改

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;
}
}

对于这种特殊情况,填充应该没有问题。如果有条件,我可以正确解析并到达*msghead == '0'之内。但是,我没有从a, b and c获得期望的值。我已经尝试了很多情况,但是这些值没有多大意义。

我如何测试:

echo -n -e '\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000

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

echo -n -e '\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' | nc localhost 9000

我得到1 0 0

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

1 个答案:

答案 0 :(得分:1)

问题出在这里

<script type="text/javascript">
  // This function will be called correctly when the captcha is loaded
  var onloadCallback = function() { myapp.captcha.onloadCallback() };
  // This function will not be found by recaptcha.js
  var testObject = { onDataCallback: function(x) { myapp.captcha.onDataCallback(x) };
</script>

如果您阅读this POSIX reference,将会看到uint64_t a = htons(st->u); uint32_t b = htons(st->v); uint32_t c = htons(st->w); 16位 整数,而htons是32位整数。没有适用于64位类型的 standard 函数。

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