我对 C++ 很陌生,但我正在尝试学习 TCP 套接字编码的一些基础知识。不管怎样,我已经能够发送和接收消息,但我想在我的数据包前面加上数据包的长度前缀(就像我在过去制作的 C# 应用程序中所做的那样),所以当我的窗口收到 FD_READ 命令时,我有以下代码仅读取数据包的前两个字节以用作短整型。
char lengthBuffer[2];
int rec = recv(sck, lengthBuffer, sizeof(lengthBuffer), 0);
short unsigned int toRec = lengthBuffer[1] << 8 | lengthBuffer[0];
让我感到困惑的是,在数据包进入“rec”变量后,它表示读取了多少字节是一个,而不是两个,如果我将 lengthBuffer 设置为三个字符而不是两个,它会读取三个字节,但如果是四个字节,它也读取三(仅奇数)。我无法判断我是否犯了一些非常愚蠢的错误,或者从根本上误解了语言或 API 的某些部分。我知道 recv 不保证将读取任意数量的字节,但如果只有两个字节,则不应进行多次读取。
因为您无法假设有多少数据可用,所以您需要不断从套接字读取数据,直到获得所需的数据量。像这样的东西应该有效:
ssize_t rec = 0;
do {
int result = recv(sck, &lengthBuffer[rec], sizeof(lengthBuffer) - rec, 0);
if (result == -1) {
// Handle error ...
break;
}
else if (result == 0) {
// Handle disconnect ...
break;
}
else {
rec += result;
}
}
while (rec < sizeof(lengthBuffer));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)