下面的代码是从套接字读取4个字节为整数.我可以看到字节是(十进制)130 0 0 0.我怀疑下面的代码将返回版本130但我不知道为什么.这会回归130吗?我试图用Java复制它,但我的数字非常大(更符合我的预期).我如何解释下面的伪/ C代码?
#include <socket.h>
void readVersion(char *buf, int iCount) {
recv(hSocket, buf, iCount, MSG_WAITALL);
}
int m_iVersion;
readVersion((char *) &m_iVersion, sizeof (m_iVersion))
count << m_iVersion;
Run Code Online (Sandbox Code Playgroud)
忽略您return在void函数中调用的明显错误...
根据定义,该recv函数返回一个整数,告诉您读取的字节数(如果错误则为负数).如果要读取字节并返回它们,则需要缓冲区,而不是读取的字节数.cout
然而,打印int将打印整个事物..不像你期望的那样逐字节.这样的事情怎么样?
int nb, i;
union {
uint32_t whole;
char bytes[4];
} v;
nb = recv(hSocket, v.bytes, 4, MSG_WAITALL);
if (nb != 4)
printf("Error: recv returned: %d\n", nb);
else
printf("%d %d %d %d\n", v.bytes[0], v.bytes[1], v.bytes[2], v.bytes[3]);
Run Code Online (Sandbox Code Playgroud)
首先,您应该确保从上面的示例中看到"130 0 0 0"或"0 0 0 130".
现在,尝试添加:
printf("%u\n", v.whole);
Run Code Online (Sandbox Code Playgroud)
看看你是否得到130.如果你这样做,那很好.如果您反而得到2 181 038 080或-33 554 432意味着您的字节顺序错误(google'endianness').您可以使用字节重新排序命令来解决此问题:
v.whole = ntohl(v.whole);
printf("%u\n", v.whole);
Run Code Online (Sandbox Code Playgroud)
ntohl 重新排序字节以使字节顺序与本地计算机匹配.