Есть классы, которые отвечают за чтение и запись. Имеют прототип
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 для этих целей ? Хотелось бы работать как с потоками.
Здравствуйте, gpepsi, Вы писали:
G>Это не очень удобно.
G>Есть ли что в boost для этих целей ? Хотелось бы работать как с потоками.
Есть
Boost.Asio, а в нем есть
Socket Iostreams.
Подойдет ?
Здравствуйте, _nn_, Вы писали:
__>Есть Boost.Asio, а в нем есть Socket Iostreams.
__>Подойдет ?
Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.
А что если я не знаю размера? как тогда читать (что есть критерий остановки)
З.Ы. И есть ли в бусте готовые реализации серверов (TCP например)
Здравствуйте, gpepsi, Вы писали:
G>Здравствуйте, _nn_, Вы писали:
__>>Есть Boost.Asio, а в нем есть Socket Iostreams.
__>>Подойдет ?
G>Ну если мой протокол подразумевает начальный заголовок с размером данных, то понятно.
G>А что если я не знаю размера? как тогда читать (что есть критерий остановки)
Если вы пишете свой протокол, вам и нужно подумать о критерии остановки.
G>З.Ы. И есть ли в бусте готовые реализации серверов (TCP например)
В библиотеке полно разных примеров:
Boost.Asio Examples