C ++套接字接收未收到正确的字节数?

use*_*878 1 c++ sockets

我是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];
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,在数据包进入“ rec”变量后,该变量表示读取了多少个字节,是一个字节,而不是两个字节;如果我将lengthBuffer设置为三个字符而不是两个字符,它将读取三个字节,但是如果是四个,它还会读取三个(仅奇数)。我无法确定我是在犯一些真正的愚蠢错误,还是从根本上误解了语言或API的某些部分。我知道recv不能保证将读取任何数量的字节,但是如果只有两个字节,则不应进行多次读取。

Jul*_*ian 5

由于您无法假设会有多少数据可用,因此您需要不断从套接字读取数据,直到获得所需的数据量为止。这样的事情应该起作用:

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));
Run Code Online (Sandbox Code Playgroud)

  • 您应该在循环内检查来自`recv`的错误,而不仅仅是将返回值添加到`rec`中。 (2认同)