C++ Socket recv 接收不到正确的字节数?

标签 c++ sockets

我是 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/

相关文章:

c++ - CMake 无法找到 BOOST 库

带路由器的 C++ 套接字

c++ - OpenGL,将纹理从图像应用到等值面

c++ - 使用 C++ 在 vi​​sual studio 中进行套接字编程

c++ - 丢包超时 (UDP)

perl - 如何在 Perl 中使用客户端和服务器传输哈希?

c++ - 调用atomic的store()时可以调用基类型类的函数吗? C++

linux - strace -e trace=network 只显示 SIGCHLD?

python - 是什么导致 Python 套接字错误?

c++ - QT moc.exe生成空文件,涉及type_traits错误