Boost Asio Streambuf, UDP, Передача структур данных по сети

205
19 июня 2022, 18:10

Всем привет! Когда клиент отправляет серверу(или наоборот) буфер данных сделанное с помощью boost::asio::streambuf то данные как то смещаются и на выходе другие данные почему?

Ввод:

MyStruct myStruct;
myStruct.v1 = 55;
myStruct.v2 = 66;
myStruct.v3 = 77;

Вывод данных после передачи по сети: Все нужные значения записались в первую переменную. Наверно я что то не так делаю.

Код клиента:

#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio/ip/udp.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/array.hpp>
#include <boost/asio/streambuf.hpp>
#include <iomanip>
struct MyStruct
{
public:
    int v1, v2, v3;
};
std::ostream& operator<<(std::ostream& out, MyStruct const& p) {
    out << p.v1;
    out << p.v2;
    out << p.v3;
    return out;
}
std::istream& operator>>(std::istream& in, MyStruct& p) {
    in >> p.v1;
    in >> p.v2;
    in >> p.v3;
    return in;
}
using boost::asio::ip::udp;
int main()
{
    try
    {
        boost::asio::io_service io_service;
        udp::resolver resolver(io_service);
        udp::resolver::query query(udp::v4(), "localhost", "23456");
        udp::endpoint receiver_endpoint = *resolver.resolve(query);
        udp::socket socket(io_service);
        socket.open(udp::v4());
        boost::asio::streambuf b;
        std::ostream os(&b);
        MyStruct myStruct;
        myStruct.v1 = 55;
        myStruct.v2 = 66;
        myStruct.v3 = 77;
        os << myStruct;
        socket.send_to(b.data(), receiver_endpoint);
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

Код сервера:

#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio/ip/udp.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/array.hpp>
#include <boost/asio/streambuf.hpp>
#include <iomanip>
using boost::asio::ip::udp;
struct MyStruct
{
public:
    int v1, v2, v3;
};
std::ostream& operator<<(std::ostream& out, MyStruct const& p) {
    out << p.v1;
    out << p.v2;
    out << p.v3;
    return out;
}
std::istream& operator>>(std::istream& in, MyStruct& p) {
    in >> p.v1;
    in >> p.v2;
    in >> p.v3;
    return in;
}

int main()
{
    try
    {
        boost::asio::io_service io_service;
        udp::socket socket(io_service, udp::endpoint(udp::v4(), 23456));
        for (;;)
        {
            udp::endpoint remote_endpoint;
            boost::system::error_code error;
            boost::asio::streambuf b;
            boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(512);
            size_t n = socket.receive_from(bufs, remote_endpoint, 0, error);
            if (error && error != boost::asio::error::message_size)
                throw boost::system::system_error(error);
            b.commit(n);
            std::istream is(&b);
            MyStruct myStruct;
            is >> myStruct;
            std::cout << "v1: " << myStruct.v1 << std::endl;
            std::cout << "v2: " << myStruct.v2 << std::endl;
            std::cout << "v3: " << myStruct.v3 << std::endl;
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}
READ ALSO
Почему внедрение библиотеки не работает?

Почему внедрение библиотеки не работает?

Пытался написать код на внедрение библиотеки в только что созданный процесс, но что-то не получаетсяФункция inject возвращает true, но сама библиотека...

109
В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать?

В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать?

В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать? Увидел в примерах boost asio наследование от enable_shared_from_this, что это...

131
Проблема переполнения буфера при выводе одномерного массива С++

Проблема переполнения буфера при выводе одномерного массива С++

Проблема при переполнении памяти в выводе изменённой матрицыЗадача: По указанию пользователя с положительных четных или отрицательных...

188
Сравнение разности двух вещественных чисел с третьим вещественным числом

Сравнение разности двух вещественных чисел с третьим вещественным числом

У меня есть вещественные числа a, b и сНужно чтобы выполнялось выражение c == (b - a), проблема возникает именно с "равно"

79