У меня есть следующая проблема: есть моя структура:
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 байтов (заголовок). Строковая часть сообщения заполняется случайными байтами. Что я делаю неправильно? Я пробовал много вариантов с одинаковым результатом. Благодарю.
Персонажи не входят в вашу структуру. Структура содержит указатель на них, и вы отправляете указатель плюс некоторые дополнительные случайные байты, следующие за структурой.
Похоже, вы просто пытаетесь отправить строку (в вашей структуре больше ничего не нужно), поэтому вам нужно сделать две записи: 4-байтная запись длины строки, за которой следует N-байтовая запись фактических строковых данных,
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));