我正在使用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
我不确定我可以修复的字节顺序是否有问题,但是在任何一种情况下,似乎还存在其他问题。
答案 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位变体。