recv()获取损坏的数据

时间:2019-01-28 15:52:09

标签: c++ sockets

我正在尝试从C ++应用程序中的C#服务器接收大数据(大约7MB)。我使用此库来这样做:https://github.com/DFHack/clsocket 但是,当我收到它时,我会得到严重损坏的数据。这是我如何获取的代码:

unsigned char* image_data = client->ReadBytes(lmi_reply);

lmi_reply是我想要接收的数据的确切大小。 ReadBytes

uint8* Client::ReadBytes(int r) {
    try {
        uint8* data = new uint8(r);
        this->m_s->Receive(r, data); // m_s is the CActiveSocket object.
        return data;
    }
    catch (...) {
        return 0;
    }
}

我做错了什么?

P.S。当我同时使用C#客户端和服务器时,数据与服务器上的数据完全相同。

1 个答案:

答案 0 :(得分:0)

我通过将ReadBytes更改为此来解决了这个问题:

uint8* Client::ReadBytes(int r) {
    try {
        char* data = new char[r];
        memset(data, 0, r);

        int maxBufferSize = 8192;

        auto bytesReceived = decltype(r){0};
        while (r > 0)
        {
            const auto bytesRequested = (r > maxBufferSize) ? maxBufferSize : r;
            const auto returnValue = recv(this->m_s->GetSocketDescriptor(), data + bytesReceived, bytesRequested, 0);
            if (returnValue == -1 || returnValue == 0)
                return (uint8*)data;

            bytesReceived += returnValue;
            r -= returnValue;
        }

        return (uint8*)data;
    }
    catch (...) {
        return 0;
    }
}