Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > таймаут на connect winsock


Автор: ProgMaster 17.9.2007, 12:47
Пытаюсь реализовать таймаут следующим образом:
Код

//в неблокирующий режим
            int block = 1;//+
            int err = -123;
            err = ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);// здесь возвращает 0, все норм

            int ret = connect(in_Socket, in_Socks,  socksLen);

            int error = WSAGetLastError( );
            if ( ( error == WSAEWOULDBLOCK ) || ( error == WSAEINPROGRESS ) )
            {
                Log(IntToStr(error)); // ТУТ получаю WSAEWOULDBLOCK  (10035), тоже непонятная тема
                //return -1;
            }

            timeval time_out;
            time_out.tv_sec = 5;
            time_out.tv_usec = 0; //5 sek


            fd_set setW, setE;
            
            FD_ZERO(&setW);
            FD_SET(in_Socket, &setW);
            FD_ZERO(&setE);
            FD_SET(in_Socket, &setE);

            int ierr1=12;
            ierr1 = select(0, NULL, &setW, &setE, &time_out);
            
            if (FD_ISSET(in_Socket, &setW))
            {
                // Connect granted
                retval = ret;
            }//if
            else if (FD_ISSET(in_Socket, &setE))
            {
                return retval;       // failed to connect
            }//else if
            else
            {
                return retval;      // timeout
            }//else
                
            //entering non blocking
            block = 0;//+
            ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);//+ 

А вот строчка:
Код

int ret = connect(in_Socket, in_Socks,  socksLen);
Без всяких пауз сразу же возвращает "-1".

Дойдя до: 
Код

ierr1 = select(0, NULL, &setW, &setE, &time_out);

ierr1=1. Но паузы на ф-ии никакой нету. Сразу же идет дальше сюда:
Код

if (FD_ISSET(in_Socket, &setW))
            {
                // Connect granted
                retval = ret;

Хотя на самом деле никакого connect'a нету.

Что я делаю не так ?

Автор: W4FhLF 18.9.2007, 12:15
Цитата(ProgMaster @  17.9.2007,  12:47 Найти цитируемый пост)
Что я делаю не так ?


Ну как что, раз connect возвращает -1 значит удалённый сервер не хочет иметь с тобой связь. 

PS Покажи весь код(создание сокета, заполнение структур для вызова connect, инициализация socket library).

Автор: nalek 19.9.2007, 07:18
Цитата(ProgMaster @  17.9.2007,  17:47 Найти цитируемый пост)
Что я делаю не так ? 


Код

попробуй так:
//в неблокирующий режим
            int block = 1;//+
            int err = -123;
            err = ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);// здесь возвращает 0, все норм
            int ret = connect(in_Socket, in_Socks,  socksLen);
            int error = WSAGetLastError( );
            if ( ( error == WSAEWOULDBLOCK ) || ( error == WSAEINPROGRESS ) )
            {
                Log(IntToStr(error)); // ТУТ получаю WSAEWOULDBLOCK  (10035), тоже непонятная тема
                //return -1;
            }
///////////////////
          //entering non blocking
            block = 0;//+
            ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);//+ 
///////////////////

            timeval time_out;
            time_out.tv_sec = 5;
            time_out.tv_usec = 0; //5 sek
            fd_set setW, setE;
            
            FD_ZERO(&setW);
            FD_SET(in_Socket, &setW);
            FD_ZERO(&setE);
            FD_SET(in_Socket, &setE);
            int ierr1=12;
            ierr1 = select(0, NULL, &setW, &setE, &time_out);
            
            if (FD_ISSET(in_Socket, &setW))
            {
                // Connect granted
                retval = ret;
            }//if
            else if (FD_ISSET(in_Socket, &setE))
            {
                return retval;       // failed to connect
            }//else if
            else
            {
                return retval;      // timeout
            }//else
                
 

Автор: Artemon 19.9.2007, 12:45
Была подобная проблема.

но я ее решил и на форум выложил исходники, так что пользуйся поиском

Автор: ProgMaster 19.9.2007, 12:45
Цитата(nalek @ 19.9.2007,  07:18)
Цитата(ProgMaster @  17.9.2007,  17:47 Найти цитируемый пост)
Что я делаю не так ? 


Код

попробуй так:
//в неблокирующий режим
            int block = 1;//+
            int err = -123;
            err = ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);// здесь возвращает 0, все норм
            int ret = connect(in_Socket, in_Socks,  socksLen);
            int error = WSAGetLastError( );
            if ( ( error == WSAEWOULDBLOCK ) || ( error == WSAEINPROGRESS ) )
            {
                Log(IntToStr(error)); // ТУТ получаю WSAEWOULDBLOCK  (10035), тоже непонятная тема
                //return -1;
            }
///////////////////
          //entering non blocking
            block = 0;//+
            ioctlsocket (in_Socket, FIONBIO, (u_long FAR*) &block);//+ 
///////////////////

            timeval time_out;
            time_out.tv_sec = 5;
            time_out.tv_usec = 0; //5 sek
            fd_set setW, setE;
            
            FD_ZERO(&setW);
            FD_SET(in_Socket, &setW);
            FD_ZERO(&setE);
            FD_SET(in_Socket, &setE);
            int ierr1=12;
            ierr1 = select(0, NULL, &setW, &setE, &time_out);
            
            if (FD_ISSET(in_Socket, &setW))
            {
                // Connect granted
                retval = ret;
            }//if
            else if (FD_ISSET(in_Socket, &setE))
            {
                return retval;       // failed to connect
            }//else if
            else
            {
                return retval;      // timeout
            }//else
                
 

Спасибо. Помогло. Странно, почему я до этого не догадался. Явно нужно было переходить в блокирующий режим, т.к. select блокирующая ф-ия  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)