Структурное преобразование в исходный символ

0

У меня есть следующая проблема: есть моя структура:

struct NET_CONNECTION_DISPATCH
{
    int len;
    int data_str_len;
    const char * data_str;
};

И здесь используется эта структура:

const std::string dstr = "127.0.0.1 11001";
    ncd.len = 8 + dstr.length();
    ncd.data_str_len = dstr.length();
    ncd.data_str = dstr.c_str();

После этого я хочу отправить его boost asio:

boost::asio::async_write(socket_, boost::asio::buffer((char*)&ncd, ncd.len),
      boost::bind(&Connection::handle_write, shared_from_this(),
        boost::asio::placeholders::error));

В полученном клиентом сообщении все нормально до 8 байтов (заголовок). Строковая часть сообщения заполняется случайными байтами. Что я делаю неправильно? Я пробовал много вариантов с одинаковым результатом. Благодарю.

Теги:
struct

2 ответа

1
Лучший ответ

Персонажи не входят в вашу структуру. Структура содержит указатель на них, и вы отправляете указатель плюс некоторые дополнительные случайные байты, следующие за структурой.

Похоже, вы просто пытаетесь отправить строку (в вашей структуре больше ничего не нужно), поэтому вам нужно сделать две записи: 4-байтная запись длины строки, за которой следует N-байтовая запись фактических строковых данных,

1

data_str в NET_CONNECTION_DISPATCH - это указатель, значение data_str - это всего лишь 4-байтовый адрес памяти. когда вы используете (char *) & ncd, содержание & ncd - всего три ints. Если вы действительно хотите использовать эту структуру таким образом, вы должны вывести data_str отдельно.

boost::asio::async_write(socket_, boost::asio::buffer(ncd.data_str, ncd.len-8),
  boost::bind(&Connection::handle_write, shared_from_this(),
    boost::asio::placeholders::error));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню