URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6461
[ Назад ]

Исходное сообщение
"Как определить готовность сокета к приему данных (по recv)"

Отправлено caleb , 15-Май-07 14:31 
Привет, All!

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


Содержание

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

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


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

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


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

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



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

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


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

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


"Как определить готовность сокета к приему данных (по recv)"
Отправлено caleb , 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 )
...

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