Почему данные не приходят из сокета? - PullRequest
0 голосов
/ 06 мая 2019

Сервер постоянно отправляет данные клиенту с интервалом в 1 секунду - 2 минуты.Данные поступают, но через 15-20 минут клиент перестает получать сообщения.В этом случае rv равно 1 и n!= 0 и сервер отправляет данные (проверено).

while(1){
    FD_ZERO(&set);
    FD_SET(sockfd, &set);

    timeout.tv_sec = 30;
    timeout.tv_usec = 0;

    rv = select(sockfd + 1, &set, NULL, NULL, &timeout);
    std::cout << "rv Read: " << rv << std::endl;
    if(rv == -1){
        printf("ERROE select\n");
        restartSocket();
    }
    else if(rv == 0){
        printf("READ timeout\n");
    }
    else{
        bzero(buffer,256);
        printf("Start read\n");

        int n;
        n = read(sockfd,buffer,256);
        if (n < 0){
            printf("ERROR reading from socket");
            restartSocket();
        }
        printf("read: %s\n",buffer);
    }
}

Еще через 10-15 минут read () возвращает -1, а затем сервер снова подключается, и все начинает работать нормально в течение тех же 15-20 минути тогда все идет по кругу.

Как заставить клиента всегда получать данные с сервера?Или как заставить read () или select () понять, что все равно нет соединения с сервером и дал команду сбросить сокет?(Но я думаю, что повторное подключение каждые 5-10 минут как-то неправильно)

1 Ответ

1 голос
/ 06 мая 2019

Вы не учитываете возможность read() возврата 0, когда соединение изящно закрыто узлом.Кроме этого, все остальное, что касается управления соединением, выглядит нормально (хотя, buffer не завершается нулем, если точно 256 байт считаны, но это помимо смысла для этой проблемы):

//bzero(buffer, 256); //not needed
printf("Start read\n");

int n = read(sockfd, buffer, 256);
if (n <= 0){
    if (n < 0)
        printf("ERROR reading from socket\n");
    else
        printf("socket disconnected\n");
    restartSocket();
} else {
    printf("read: %.*s\n", n, buffer);
}

Кроме того, когда вы вызываете restartSocket(), вам, вероятно, следует выйти из цикла while и не вводить его повторно до тех пор, пока новое соединение не будет полностью установлено (если restartSocket() не обрабатывает это внутренне и не обновляет sockfd до этого).следующая итерация цикла).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...