Название: boost asio
Отправлено: deefox от Июль 28, 2016, 11:00
Доброго времени суток. Пытаюсь передавать пакеты по udp, на данный момент 12 к, размером 1240б и 1390б. Через QNetwork приходит около 8к. Обмен на 1 компьютере. Как можно уменьшить потери? Пошарился, много где указывали, что boost asio получше будет принимать. Я его подключил, пытался настроить прием, но никак не получается... отправляю, но принимаю мизерное количество байт, если вообще что то принимает... что я делаю не так? h #ifndef BOOST_ASIO_H #define BOOST_ASIO_H
#include <QObject> #include <QTimer>
#include <QtNetwork/QUdpSocket> #include <QString> #include <QDataStream> #include <QDebug> #include <QByteArray> #include <iostream> #include <QThread> #include <QtConcurrent/QtConcurrentRun>
#include <boost/ref.hpp> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/thread.hpp> #include <boost/format.hpp> #include <boost/optional.hpp> #include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/utility/in_place_factory.hpp>
using namespace boost::asio; using namespace std;
//void read_handler( // const boost::system::error_code& ec, std::size_t bytes_transferred);
class boost_asio : public QObject { Q_OBJECT public: boost_asio(QObject *parent); void Init(string address, int port); ip::address addr; int portInput; io_service service; ip::udp::socket *udpSocket;
QByteArray arr; boost::asio::ip::udp::endpoint sender_ep;
// void read_handler( // const boost::system::error_code& ec, // std::size_t bytes_transferred);
// void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);
void read_handler(char *ptr, const boost::system::error_code& ec, std::size_t bytes_transferred);
void newThread(); private:
public slots:
};
#endif // BOOST_ASIO_H
cpp #include "boost_asio.h"
boost_asio::boost_asio(QObject *parent) : QObject(parent) {
arr.clear(); }
void boost_asio::Init(string address,int port) {
addr = ip::address::from_string(address); udpSocket = new ip::udp::socket(service);
sender_ep = ip::udp::endpoint(addr,port); ip::udp::endpoint res(addr,4810); qDebug()<< sender_ep.port();/*addr,port);*/ qDebug() << QString::fromStdString(sender_ep.address().to_string()); // ip::udp::socket sock(service); // udpSocket = sock; udpSocket->open(sender_ep.protocol());
udpSocket->bind(sender_ep);
// qDebug() << udpSocket->send_to(buffer("testing\n"), ep); // udpSocket->bind(res); // udpSocket->async_connect(sender_ep, boost::bind(&boost_asio::read_handler, this // , boost::asio::placeholders::error // , boost::asio::placeholders::bytes_transferred)); qDebug() << udpSocket->is_open();
udpSocket->set_option(boost::asio::ip::udp::socket::reuse_address(true)); // udpSocket->async_receive_from(buffer(buff,512),sender_ep, ReadHendler); // char * buf = new char[1400]; // udpSocket->async_receive(buffer(buf,1400), boost::bind(&boost_asio::read_handler, this, buf // , boost::asio::placeholders::error // , boost::asio::placeholders::bytes_transferred()));
// QtConcurrent::run(QThreadPool::globalInstance(),boost_asio::newThread,); // arr.push_back(buf); // qDebug()<<arr.size(); // ip::tcp::socket::send_buffer_size sbs; // udpSocket->get_option(sbs); // qDebug() << sbs.value(); char * buf = new char[1400]; qDebug()<< sizeof(buf); udpSocket->async_receive(buffer(buf,1400), boost::bind(&boost_asio::read_handler, this, buf , boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred())); QFuture<void> future = QtConcurrent::run(this,&boost_asio::newThread); // service.run();
}
void boost_asio::read_handler(char *ptr, const boost::system::error_code& ec, std::size_t bytes_transferred) { arr.push_back(ptr); qDebug()<<arr.size(); char * buf = new char[1400]; udpSocket->async_receive(buffer(buf,1400), boost::bind(&boost_asio::read_handler, this, buf , boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred));
}
void boost_asio::newThread() { service.run();
}
Название: Re: boost asio
Отправлено: nwnclv от Август 02, 2016, 23:49
Не правильно ты, дядя Федор, колбасу ешь. UDP нельзя принимать кусками, он может прийти либо весь, либо никак. Для того, чтоб получить 12 килобайт, тебе нужен соответсвующего размера приемный буфер. (SO_RECVBUF) для того, чтоб отправить - SO_SNDBUF. По-умолчанию этти беферы, если память не изменяет, 4килобайта. И еще void boost_asio::read_handler(char *ptr, const boost::system::error_code& ec, std::size_t bytes_transferred) { arr.push_back(ptr); qDebug()<<arr.size(); char * buf = new char[1400]; udpSocket->async_receive(buffer(buf,1400), boost::bind(&boost_asio::read_handler, this, buf , boost::asio::placeholders::error , boost::asio::placeholders::bytes_transferred));
} Вот как ты думаешь, зачем тут параметр const boost::system::error_code& ec? и почему ты в него не смотришь?
|