我是 C++ 的新手,但我正在尝试学习 TCP 套接字编码的一些基础知识。无论如何,我已经能够发送和接收消息,但我想在我的数据包前加上数据包的长度(就像我在过去制作的 C# 应用程序中所做的那样)所以当我的窗口收到 FD_READ 命令时,我有以下代码仅读取数据包的前两个字节以用作 short int。
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));
关于C++ Socket recv 接收不到正确的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535543/