Socket чтение buffer

163
04 января 2018, 23:45

Здравствуйте! Я в c++ новичок и у меня возникла проблема, не знаю как прочитать ответ из буфера socket сервера

Мой сайт отправляет данные

int opcode 
int key_len 
string key 
string command или char command

Как мне это прочитать? Сейчас я делаю с помощью memcpy но когда пытаюсь достать string он выдает его с лишним символом в конце

Не могли бы вы мне помочь и дать информацию по этому вопросу? как правильно все это организовать.

int countByte = recv(client->get_socket(), bufferT, 2048, 0);
        int opcode;
        memcpy(&opcode, bufferT + p, 4);
        p += 4;
        int keyLen;
        memcpy(&keyLen, bufferT + p, 4);
        p += 4;
        char server_key[keyLen];
        memcpy(&server_key, bufferT + p, keyLen);
        p += keyLen;
Answer 1

Можно добавить пару вспомогательных функций (на будущее):

template <class T> 
T read_pod(const char*& buffer) {
    static_assert(std::is_pod<T>::value, "only pod types are allowed here");
    T value{};
    std::memcpy(reinterpret_cast<char*>(&value), buffer, sizeof(T));
    buffer += sizeof(T);
    return value;
};
std::string read_string(const char*& buffer, size_t length) {
    std::string value;
    value.resize(length);
    std::memcpy(&value[0], buffer, length);
    buffer += length;
    return value;
};

Полный код с примером использования

Нюансы:

  • Убедитесь, что используете типы нужного размера. Если ключ отправляется в виде 4х байт, то и принимайте не в какой-то int, а конкретный uint32_t.
  • Убедитесь, что на отправляющей и принимающей стороне совпадает endianness - порядок байт.
  • Не используйте char arr[non_const_var] - это не является стандартом языка. Но если очень хочется, замените на char server_key[keyLen + 1]{}; и всё заработает.
READ ALSO
Перегруженные конструкторы?

Перегруженные конструкторы?

В заголовочном файле:

186
Задача для прокачки мозгов (IQ) [требует правки]

Задача для прокачки мозгов (IQ) [требует правки]

Имеется массив с положительными элементами (N элементов)Районном называется отрезок (l, r) (использовать нужно K районов, ни меньше ни больше),...

224