Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> таймаут на connect winsock, не работает =\ 
V
    Опции темы
ProgMaster
  Дата 17.9.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Пытаюсь реализовать таймаут следующим образом:
Код

//в неблокирующий режим
            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 нету.

Что я делаю не так ?
PM MAIL ICQ   Вверх
W4FhLF
Дата 18.9.2007, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



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


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

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


Это сообщение отредактировал(а) W4FhLF - 18.9.2007, 13:52


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
nalek
Дата 19.9.2007, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.6.2005

Репутация: нет
Всего: нет



Цитата(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
                
 

PM   Вверх
Artemon
Дата 19.9.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Была подобная проблема.

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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
ProgMaster
Дата 19.9.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 24.1.2006
Где: Estonia

Репутация: нет
Всего: нет



Цитата(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 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.