Считать конкретное количество данных проблем нет. Размер данных, которые могут прийти не может быть больше чем buf_len. Но он может быть меньше. Как в этом случае правильно организовать выход из цикла и узнать что считали все пришедшие данные. То есть куда лучше вставить return buf_len;? При второй итерации в цикле read вернет ноль или EAGAIN, если мы считали все данные при первом проходе?
int full_read(int fd, char *buf, size_t buf_len, size_t retry_number = 50)
{
int SUCCESS = -1;
int current_errno = 0;
size_t counter_reply = retry_number + 1;
ssize_t count_rb = 0;
do
{
count_rb = read(fd, buf, buf_len);
if (count_rb == -1)
{
current_errno = errno;
if (EINTR == current_errno)
{
continue;
}
else if ( EAGAIN == current_errno) //not data
{
SUCCESS = 0;
return SUCCESS;
}
else //unknown error
{
std::cerr << "Error read";
throw "Error read";
}
}
buf_len -= count_rb;
buf += count_rb;
--counter_reply;
}
while (counter_reply && buf_len);
throw "Error read reply";
}
Добрый день, возникла следующая проблема касающаяся шаблонных классов в C++
Можете объяснить, когда возникает эта ошибка и как от нее избавиться?