Привет, All!Взял пример Роба Таугера http://gazette.linux.ru.net/lg74/articles/rus-tougher.html, в котором приведен простой сокетовский клиент-сервер, который написанный с помощью классов и сделал его неблокирующим. Но вот появилась одна проблемка: после установления соединения клиента с сервером (по select) операция send() выполняется успешно, а следующая за ней recv() возвращает ошибку 'Resource temporarily unavailable', хотя со стороны сервера вроде бы все передается нормально. Когда сокет был блокирующим все работало. Поставил задержку в 100 мс - ошибка не возникает. Как сделать правильно, но без задержки?
recv/read на неблокирующем дескрипторе можно делать только
тогда когда select/poll вернет состояние - __можно_читать__
>recv/read на неблокирующем дескрипторе можно делать только
>тогда когда select/poll вернет состояние - __можно_читать__
>
>http://www.linuxdoc.ru/manpages/man2/select_tut.2.htmlпонял, тогда вопрос: что делать пока нельзя читать?..
>>recv/read на неблокирующем дескрипторе можно делать только
>>тогда когда select/poll вернет состояние - __можно_читать__
>>
>>http://www.linuxdoc.ru/manpages/man2/select_tut.2.html
>
>понял, тогда вопрос: что делать пока нельзя читать?..блокироваться на select и не отнимать драгоценное процессорное время
то есть работать исключительно по готовности устройств ввода вывода
в этом и смысл неблокируемого read/write
>блокироваться на select и не отнимать драгоценное процессорное время
>то есть работать исключительно по готовности устройств ввода вывода
>в этом и смысл неблокируемого read/writeЯ примерно догадываюсь, но хотелось бы в коде - хотя бы приблизительно, т. к. beginner
>Я примерно догадываюсь, но хотелось бы в коде - хотя бы приблизительно,
>т. к. beginnerв ссылке выше очень грамотный пример
>в ссылке выше очень грамотный примерДобавил структуру типа 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 )
...Спасибо за помощь и добрый совет!..