LINUX.ORG.RU

non-blockong socket


0

0

Здравстуйте, маленький вопрос -

"Technically, fcntl(soc, F_SETFL, O_NONBLOCK) is incorrect since it clobbers all other file flags. Generally one gets away with it since the other flags (O_APPEND for example) don't really apply much to sockets. In a similarly rough vein, you would use fcntl(soc, F_SETFL, 0) to go back to blocking mode.

To do it right, use F_GETFL to get the current flags, set or clear the O_NONBLOCK flag, then use F_SETFL to set the flags."

Так вот, делаю я к примеру:

flags = fcntl(soc, F_GETFL);

Как мне к flags добавить или убрать O_NONBLOCK ?

anonymous

   /* make the descriptor non-blocking:*/
   flags = fcntl(soc, F_GETFL,0);/*First, save the original mode*/
   /*Add O_NONBLOCK:*/
   if(fcntl(soc, F_SETFL, flags | O_NONBLOCK) == -1)/*Fail setting non-blocking*/
      halt("fcntl");

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Я извинияюсь, а чем блокируемые сокеты отличаются от неблокируемых? Мне казалось, что неблокируемость это просто алгоритм их использования. Судя по предыдущему, я понимаю неправильно.

UncleAndy ★★★
()
Ответ на: комментарий от UncleAndy

2UncleAndy :

При чтении из блокирующего дескриптора процесс уснет, если с той стороны нету данных (аналогично при записи, если читатель данные не читает) и будет спать, пока данные не появятся.

Если дескриптор не блокирует, то при отсутствии данных read() вернет -1 и ошибку EAGAIN.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Да, думаю уверен. Для read() и write() буду использовать poll(), но клиент конектистя к нескольим серверам, поэтому connect() не должна блокироваться.

Возможно так? :) Или это неправильное сочетание non-blocking sockets & poll() ?

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (10.09.2005 5:54:38):

> Возможно так? :) Или это неправильное сочетание non-blocking sockets & poll() ?

Да, поллинг после connect()'а -- один из _очень_ немногих случаев, когда не обойтись без неблокирующего сокета.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.