FD_SET Проблема / Сеть - PullRequest
       3

FD_SET Проблема / Сеть

0 голосов
/ 08 июля 2011

привет, сейчас я пытаюсь узнать, отключился ли клиент или сервер, а затем отправить ошибку, но я не могу заставить ее работать, и у меня нет идеи, как это сделать, поэтому мне действительно нужна помощь.

вот мой код

    #ifdef _WIN32 || _WIN64
            if(select(0,&fd_read,NULL,&fd_close,&time)==-1){
                printf("Error in Select()");
                return 0;
            }
    #else
            if(select(sockMax + 1,&fd_read,NULL,&fd_close,&time)==-1){
                printf("Error in Select()");
                return 0;
            }
    #endif

 if(FD_ISSET(socklisten,&fd_read)){

        }
        else
        {
            dopack(&pkt);
            send(socklisten, (char*)&pkt, sizeof(pack), 0);
        }


//this is where the error shows -----------
        if(FD_SET(socklisten,&fd_close))
        {
            backtoMenu = true;
        }

        FD_ZERO(&fd_leer);

        FD_SET(sockEscucha,&fd_leer);

Ошибка говорит об ожидаемом первичном выражении перед 'do' так что да, я понятия не имею, что это значит и на всякий случай, вот как я объявляю fd_read и fd_close

fd_set fd_read;       
fd_set fd_close;   

PLZ любая помощь будет очень признателен Tyvm

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

То, что сказал Ричард, кроме того, третье fd_set, переданное select(), касается не закрытых FD, а скорее какого-то исключительного условия, которое требует особого внимания (которое точно определяется базовым драйвером, например,TCP-сокеты используют его для «срочных» данных.

Вы обнаруживаете удаленное закрытие по коду возврата из recv(), т. Е. Внутри обработки для читаемых дескрипторов. Если recv() в потоковом сокете возвращает 0,удаленная сторона закрыла соединение (с TCP вы все еще можете отправлять данные, так как закрыто только одно направление), если recv() возвращает -1, то errno имеет дополнительную информацию, например, ECONNRESET означает, что был получен пакет TCP RST.

0 голосов
/ 08 июля 2011

Вы хотите использовать if (FD_ISSET (...

). Чтобы определить, закрылся ли клиент, вы хотите прочитать с активного readfd и посмотреть, вернет ли чтение ноль.

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