Как правильно восстановить неблокирующий сокет? - PullRequest
0 голосов
/ 19 июня 2020

Я прочитал много статей и вопросов и ответов, но я все еще потерял проблемы .. Сокет ET, неблокирующий, и я использовал epoll, и теперь я хочу получить некоторые данные о нем. Код находится под моими вопросами. (Я полагаю, правильный?)

Мои вопросы:

Как я могу узнать, получил ли я все данные? Когда я запускаю этот сервер, каждый раз, когда l oop прерывается с EAGAIN. Я обнаружил, что некоторые люди говорят, что «EAGAIN означает, что нет данных для чтения из неблокирующего сокета». Что ж, это имеет смысл.

Но равно ли это «Сервер получил все данные от клиента, когда EAGIAN?» Отрицательный пример: возможно, буфер сокета заполнен, и на этот раз мы получаем EAGAIN, но на самом деле у клиента все еще есть несколько слов для отправки. Возможно ли такое?

А можно ли добавить эти строчки else if (nread < BUFF_SIZE) break;? Могу ли я сказать, если nread меньше BUFF_SIZE, я уже получил все данные?

Помогите мне, пожалуйста, T_T

string read_buf;
char buff[BUFF_SIZE];
while (true) {
    int nread = recv(fd, buff, BUFF_SIZE, 0);
    if (nread < 0) {
        if (errno == EINTR) continue;
        else if (errno == EAGAIN || errno == EWOULDBLOCK) {
            break;
        }
        else {
            perror("read error");
            return -1;
        }
    } 
    else if (nread == 0) {
        close(fd);
        break;
    }
    read_buf += std::string(buff, buff + nread);
}
...