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


Код: 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
Таймаут для connect (winsock)
    #33933879
DжеFF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжает работать?
...
Рейтинг: 0 / 0
Таймаут для connect (winsock)
    #33937502
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DжеFFПродолжает работать?

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

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

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


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