The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как определить готовность сокета к приему данных (по recv)"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как определить готовность сокета к приему данных (по recv)"  
Сообщение от caleb (ok) on 15-Май-07, 14:31 
Привет, All!

Взял пример Роба Таугера http://gazette.linux.ru.net/lg74/articles/rus-tougher.html, в котором приведен простой сокетовский клиент-сервер, который написанный с помощью классов и сделал его неблокирующим. Но вот появилась одна проблемка: после установления соединения клиента с сервером (по select) операция send() выполняется успешно, а следующая за ней recv() возвращает ошибку 'Resource temporarily unavailable', хотя со стороны сервера вроде бы все передается нормально. Когда сокет был блокирующим все работало. Поставил задержку в 100 мс - ошибка не возникает. Как сделать правильно, но без задержки?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от devcoder email(ok) on 15-Май-07, 15:53 
recv/read на неблокирующем дескрипторе можно делать только
тогда когда select/poll вернет состояние - __можно_читать__

http://www.linuxdoc.ru/manpages/man2/select_tut.2.html

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от caleb (ok) on 15-Май-07, 16:22 
>recv/read на неблокирующем дескрипторе можно делать только
>тогда когда select/poll вернет состояние - __можно_читать__
>
>http://www.linuxdoc.ru/manpages/man2/select_tut.2.html

понял, тогда вопрос: что делать пока нельзя читать?..

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от devcoder email(ok) on 15-Май-07, 16:26 
>>recv/read на неблокирующем дескрипторе можно делать только
>>тогда когда select/poll вернет состояние - __можно_читать__
>>
>>http://www.linuxdoc.ru/manpages/man2/select_tut.2.html
>
>понял, тогда вопрос: что делать пока нельзя читать?..

блокироваться на select и не отнимать драгоценное процессорное время
то есть работать исключительно по готовности устройств ввода вывода
в этом и смысл неблокируемого read/write


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от caleb (ok) on 15-Май-07, 16:53 
>блокироваться на select и не отнимать драгоценное процессорное время
>то есть работать исключительно по готовности устройств ввода вывода
>в этом и смысл неблокируемого read/write

Я примерно догадываюсь, но хотелось бы в коде - хотя бы приблизительно, т. к. beginner

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от devcoder email(ok) on 15-Май-07, 17:01 
>Я примерно догадываюсь, но хотелось бы в коде - хотя бы приблизительно,
>т. к. beginner

в ссылке выше очень грамотный пример

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как определить готовность сокета к приему данных (по recv)"  
Сообщение от caleb (ok) on 15-Май-07, 19:37 
>в ссылке выше очень грамотный пример

Добавил структуру типа fd_set для проверки готовности сокета на получение данных и все заработало.

Было так:

...
  tv.tv_sec = sel_seconds;
  tv.tv_usec = 0;
  FD_ZERO ( &wset );
  FD_SET ( m_sock, &wset);
  if ( select(m_sock+1, NULL, &wset, NULL, &tv) < 0 )
...

стало так:

...
  tv.tv_sec = sel_seconds;
  tv.tv_usec = 0;
  FD_ZERO ( &rset ); // добавлено
  FD_ZERO ( &wset );
  FD_SET ( m_sock, &rset ); //добавлено
  FD_SET ( m_sock, &wset );

  if ( select( m_sock+1, &rset, &wset, NULL, &tv ) < 0 )
...

Спасибо за помощь и добрый совет!..

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру