Как правильно записать функцию чтения в буффер на с, c++

799
06 февраля 2017, 16:48

Считать конкретное количество данных проблем нет. Размер данных, которые могут прийти не может быть больше чем 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";
}
READ ALSO
Шаблонные класcы C++. C3203

Шаблонные класcы C++. C3203

Добрый день, возникла следующая проблема касающаяся шаблонных классов в C++

839
Ошибка Stack overflow, как избежать и что это?

Ошибка Stack overflow, как избежать и что это?

Можете объяснить, когда возникает эта ошибка и как от нее избавиться?

836
Visual studio 2012 пишет Symbols loaded

Visual studio 2012 пишет Symbols loaded

Когда запускаю любой проект она мне пишет

822