Russian Qt Forum
Ноябрь 22, 2024, 20:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: boost asio  (Прочитано 3654 раз)
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();

}



« Последнее редактирование: Июль 28, 2016, 11:02 от deefox » Записан
nwnclv
Гость
« Ответ #1 : Август 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? и почему ты в него не смотришь?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 20.