Всем привет! Когда клиент отправляет серверу(или наоборот) буфер данных сделанное с помощью 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытался написать код на внедрение библиотеки в только что созданный процесс, но что-то не получаетсяФункция inject возвращает true, но сама библиотека...
В каких случаях нужно наследоваться от std :: enable_shared_from_this и зачем это делать? Увидел в примерах boost asio наследование от enable_shared_from_this, что это...
Проблема при переполнении памяти в выводе изменённой матрицыЗадача: По указанию пользователя с положительных четных или отрицательных...
У меня есть вещественные числа a, b и сНужно чтобы выполнялось выражение c == (b - a), проблема возникает именно с "равно"