Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таймаут для connect (winsock) / 7 сообщений из 7, страница 1 из 1
17.08.2006, 12:21
    #33924327
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
Как изменить/установить таймаут для вызова connect в блокирующем режиме?
...
Рейтинг: 0 / 0
17.08.2006, 15:14
    #33925103
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
Или как сделать это в неблокирующем режиме (только не отдельным потоком).
Нужно типа функции timeout_connect(SOCKET fd, ....., int timeout), может есть у кого готовые реализации.
Пробовал различными способами, нормального результата не получил. Чаще всего функция WSAGetLastError() возвращает значение WSAEWOULDBLOCK и при удачном соединении и при неудачном, также пробовал select'ами - при любом исходе выходит якобы ошибка соединения.
...
Рейтинг: 0 / 0
17.08.2006, 16:16
    #33925424
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
Для неблокирующего режима:
все правильно connect сразу возвращает SOCKET_ERROR,
а WSAGetLastError() - WSAEWOULDBLOCK.
После этого нужно делать select, пока сокет не станет читаемым
(writefds).
...
Рейтинг: 0 / 0
17.08.2006, 17:11
    #33925751
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
получилось вот как:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
        //в неблокирующий режим 
	unsigned long block =  1 ;//+
	ioctlsocket ((unsigned int)my_sock, FIONBIO, &block);//+
	
	WSAGetLastError();

	ret = connect(my_sock,(sockaddr *)&serv_addr,  sizeof(serv_addr));

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


	fd_set setW, setE;
	
	FD_ZERO(&setW);
	FD_SET(my_sock, &setW);
	FD_ZERO(&setE);
	FD_SET(my_sock, &setE);
	select( 0 , NULL, &setW, &setE, &time_out);
	
	if (FD_ISSET(my_sock, &setW)) 
	{
		// Connect выполнен успешно

	}//if
	else if (FD_ISSET(my_sock, &setE)) 
	{
	       // Соединиться не удалось
	}//else if
	else
	{
	       // произошел таймаут (5 секунд)
	}//else
        
        //назад в блокирующий режим
   	unsigned long block =  0 ;//+
	ioctlsocket ((unsigned int)my_sock, FIONBIO, &block);//+


...
Рейтинг: 0 / 0
22.08.2006, 10:53
    #33933879
DжеFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
Продолжает работать?
...
Рейтинг: 0 / 0
23.08.2006, 13:49
    #33937502
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
DжеFFПродолжает работать?

пока продолжает, но вопрос настораживающий, в коде ошибка?

WSAGetLastError() - это очепятка
...
Рейтинг: 0 / 0
23.08.2006, 15:07
    #33937827
DжеFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таймаут для connect (winsock)
Я может как то не так понял...
Но этот код у меня в ряде случаев не вызывает коннекта как такового )
Ну т.е. коннект в принципе не произошел, а иногда произошел.
Со структурами данных в коде я не знаком, однако реализация ТаймАута мне бы очень пригодилась. Поэтому и поинтересовался.

Если можно ваше описание описанного алгоритма, то буду признателен =)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Таймаут для connect (winsock) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]