Ошибка: функция Socket Select() всегда возвращает ноль..?

может ли кто-нибудь сказать мне, почему следующий код всегда возвращает 0 . значение дескриптора сокета равно 3. Я использую TFTP-сервер open suse. который прослушивает порт 69 на локальном хосте.

Функция connect() возвращает успех..

   connection_timer.tv_sec = 2; // s
    connection_timer.tv_usec = 0; 

 FD_ZERO(&fd_reader);
    // laukiam, kol bus ka nuskaityti
    FD_SET(socket_descriptor, &fd_reader);

    int select_ready = select(socket_descriptor + 1, &fd_reader, NULL, NULL, &connection_timer); 

Когда я использую TCPdump для проверки пакета, он отправляет первый пакет, затем соединение где-то закрывается до получения подтверждения.


person Balamurugan    schedule 21.08.2011    source источник


Ответы (3)


Я подозреваю, что вы не получаете ответ, потому что вы использовали connect() в сокете UDP, что сделало так, что вы принимаете дейтаграммы только из подключенного пункта назначения.

Поскольку ответ TFTP приходит не с порта 69, а скорее с эфемерного порта, подтверждение никогда не будет получено.

Решение. Не используйте connect() сокет UDP, пока не завершите первоначальное подключение.

person Hasturkun    schedule 21.08.2011

Вы получите код возврата 0 от select, если таймер (connection_timer в вашем примере) истечет до того, как какой-либо дескриптор станет интересным.

Так что это не ошибка. Скорее всего, вы неправильно инициализировали connection_timer.

person cnicutar    schedule 21.08.2011

Необходимо вызвать функции WSAStartup. У меня такая же проблема, и она была решена после вызова этой функции запуска.

person Dishum    schedule 25.04.2012