recv () получает поврежденные данные - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь получить большие данные (около 7 МБ) с моего сервера C # в моем приложении C ++.Я использую эту библиотеку для этого: 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;
    }
}

Что я делаю не так?

PS Когда я использую и клиент C #, и сервер, данные точно такие же, как на сервере.

1 Ответ

0 голосов
/ 28 января 2019

Я исправил проблему, изменив мои 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...