Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод сокета в блоктрующий режим (WINsock 2.2)  (Прочитано 8630 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« : 26-06-2012 13:53 » 

Проблема такая:
Я создаю слушающий сокет и жду подключения с помощью связки: WSAEventSelect (переводит в non block режим ) WSAWaitForMultipleEvents.
Получаю запрос на подключение ,подключаю с помощью WSAAccept, получаю сокет соединения .
Переношу сокет соединения в отдельный поток для работы с ним, слушающий сокет продолжает ждать новых соединений.
Пытаюсь перевести сокет соединения в блокирующий режим получаю WSAEINVAL.
А черт его знает...
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #1 : 26-06-2012 14:06 » 

LemmonRus, если не путаю, то WSAEventSelect() не переводит в неблокирующий режим, а задаёт для сокета и объекта события признаки, по которым эти события будут наступать.
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #2 : 26-06-2012 14:15 » 

 Путаешь, переводит.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741576%28v=vs.85%29.aspx

The WSAEventSelect function automatically sets socket s to nonblocking mode, regardless of the value of lNetworkEvents. To set socket s back to blocking mode, it is first necessary to clear the event record associated with socket s via a call to WSAEventSelect with lNetworkEvents set to zero and the hEventObject parameter set to NULL. You can then call ioctlsocket or WSAIoctl to set the socket back to blocking mode.

Другое дело он не должен никак влиять на сокет полученный через WSAAccept.
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #3 : 26-06-2012 14:23 » 

LemmonRus, сорри. Приведите пожалуйста код, которым Вы пытаетесь включить блокировку.
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #4 : 26-06-2012 14:26 » 

//////////////////////////////////////////////////////////////////
typedef struct {
   SOCKET sok;
   HANDLE hTHREAD;
   int index;
}TcpThreadData;
////////////////////////////////////////////////////////////////

   ULONG ulB = 0;
        dat=(TcpThreadData *)dammy;
   res=ioctlsocket(dat->sok, FIONBIO, &ulB);
 
« Последнее редактирование: 26-06-2012 14:32 от LemmonRus » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #5 : 26-06-2012 14:31 » 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms738573(v=vs.85).aspx

The WSAAsyncSelect and WSAEventSelect functions automatically set a socket to nonblocking mode. If WSAAsyncSelect or WSAEventSelect has been issued on a socket, then any attempt to use ioctlsocket to set the socket back to blocking mode will fail with WSAEINVAL.

To set the socket back to blocking mode, an application must first disable WSAAsyncSelect by calling WSAAsyncSelect with the lEvent parameter equal to zero, or disable WSAEventSelect by calling WSAEventSelect with the lNetworkEvents parameter equal to zero.
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #6 : 26-06-2012 14:35 » 

Я знаю, но другое дело, что WSAEventSelect ставится на слушающий сокет , а не полученный в результате
WSAAccept.
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #7 : 26-06-2012 14:53 » 

The newly created socket has the same properties as socket s including asynchronous events registered with WSAAsyncSelect or with WSAEventSelect.
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #8 : 26-06-2012 15:02 » 

 Как я сам раньше не додумался
сделать    WSAEventSelect (dat->sok,0,0); на сокете подключения.
Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines