下面的代码是从套接字读取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;
答案 0 :(得分:5)
忽略您在return
函数中调用void
的明显错误...
recv
函数,definition,返回一个整数,告诉您读取的字节数(如果错误则为负数)。如果要读取字节并返回它们,则需要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]);
首先,你应该确保从上面的例子中看到“130 0 0 0”或“0 0 0 130”。
现在,尝试添加:
printf("%u\n", v.whole);
看看你是否得到130分。如果你这样做,那太好了。如果您改为2 181 038 080
或-33 554 432
,则表示您的字节顺序错误(google'endianness')。您可以使用字节重新排序命令来解决此问题:
v.whole = ntohl(v.whole);
printf("%u\n", v.whole);
ntohl
重新排序字节以使字节顺序与本地计算机匹配。
答案 1 :(得分:2)
代码存在缺陷。声明该函数不返回值,但确实如此。
recv
返回读取的字节数,因此它将打印4,读取的整数将存储在m_iVersion
中。整数是包含130还是大数取决于计算机的字节顺序。