boost::iostream
От: gpepsi  
Дата: 06.04.11 07:39
Оценка:
Есть классы, которые отвечают за чтение и запись. Имеют прототип

class Some 
{
    int read (void* ptr, int size);
    int write(const void* ptr, int size);
}



Но например для сокетов, зная размер, нужно вычитывать данные, пока не прочитал все

void read (void* ptr, int size)
{
    char* pbuffer = (char *)ptr;
    while (size > 0)
    {
        int bytes = some.read(buffer, size);
        size -= bytes;
        pbuffer += bytes;
    }
}


поэтому пришлось создать базовый класс

class IODevice{
private :
    virtual int onRead (void* ptr, int size) = 0;
    virtual int onWrite(void* ptr, int size) = 0;
public :
    void read (void* ptr, int size)
    {
        while(...)
        {
           if (error) throw ...;
        }
    }    
    void write(void* ptr, int size)
    {
        while(...)
        {
           if (error) throw ...;
        }
    }
}


И для всех классов, которым необходимо синхронное чтение заданного объема данных
наследуются от него и переопределяют виртуальные методы.

Это не очень удобно.
Есть ли что в boost для этих целей ? Хотелось бы работать как с потоками.
Re: boost::iostream
От: _nn_ www.nemerleweb.com
Дата: 06.04.11 08:15
Оценка:
Здравствуйте, gpepsi, Вы писали:


G>Это не очень удобно.

G>Есть ли что в boost для этих целей ? Хотелось бы работать как с потоками.

Есть Boost.Asio, а в нем есть Socket Iostreams.
Подойдет ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: boost::iostream
От: gpepsi  
Дата: 06.04.11 08:37
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Есть Boost.Asio, а в нем есть Socket Iostreams.

__>Подойдет ?

Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.
А что если я не знаю размера? как тогда читать (что есть критерий остановки)

З.Ы. И есть ли в бусте готовые реализации серверов (TCP например)
Re[3]: boost::iostream
От: _nn_ www.nemerleweb.com
Дата: 06.04.11 09:05
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Здравствуйте, _nn_, Вы писали:


__>>Есть Boost.Asio, а в нем есть Socket Iostreams.

__>>Подойдет ?

G>Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.

G>А что если я не знаю размера? как тогда читать (что есть критерий остановки)
Если вы пишете свой протокол, вам и нужно подумать о критерии остановки.

G>З.Ы. И есть ли в бусте готовые реализации серверов (TCP например)

В библиотеке полно разных примеров: Boost.Asio Examples
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: boost::iostream
От: zaufi Земля  
Дата: 06.04.11 17:28
Оценка:
Здравствуйте, gpepsi, Вы писали:

G>Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.

G>А что если я не знаю размера? как тогда читать (что есть критерий остановки)

если нет заголовка пакета (в котором передается размер последующих данных) тогда мы имеем дело со стримовым протоколом (например XMPP такой вот) -- все что читается из сокета просто отдаем парсеру (ну или другому объекту умеющему вычленять команды протокола из постоянно пополняющегося буфера), который по окончанию парса терма\команды\whatever (станзы, как в случае с XMPP) дергает (возможно асинхронно) обработчик команды... тем временем парсер (лексический анализатор точнее фактически) продолжает просматривать буфер вычленяя из него команды по мере их поступления...
както так в целом...
Re[4]: boost::iostream
От: gpepsi  
Дата: 06.04.11 17:36
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, gpepsi, Вы писали:


G>>Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.

G>>А что если я не знаю размера? как тогда читать (что есть критерий остановки)

Z>если нет заголовка пакета (в котором передается размер последующих данных) тогда мы имеем дело со стримовым протоколом (например XMPP такой вот) -- все что читается из сокета просто отдаем парсеру (ну или другому объекту умеющему вычленять команды протокола из постоянно пополняющегося буфера), который по окончанию парса терма\команды\whatever (станзы, как в случае с XMPP) дергает (возможно асинхронно) обработчик команды... тем временем парсер (лексический анализатор точнее фактически) продолжает просматривать буфер вычленяя из него команды по мере их поступления...

Z>както так в целом...

а если потеря куска данных, то как найти начало следующей команды (типа синхропоследовательности)?
Re[5]: boost::iostream
От: Хвост  
Дата: 06.04.11 22:40
Оценка:
Здравствуйте, gpepsi, Вы писали:

G> а если потеря куска данных, то как найти начало следующей команды (типа синхропоследовательности)?

если речь о TCP то там нет "потери куска данных", там есть только разрыв соединения.
People write code, programming languages don't.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.