LINUX.ORG.RU

Неблокирующиеся сокеты.


0

0

Работаю с сетевыми сокетами.
Читал про неблокирующиеся сокеты, написал программку. Вроде работает, но иногда зависает.
Собственно ворос заключается в том, как правильно использовать select. А именно, необходимо ее вызывать до чтения из сокета или после? В мануалах по select написано очень много и там не просто разобратся.
Я действую следующим образом:
вызываю чтение из сокета
устанавливаю для select переменную типа fd_set
/*
fd_set set;
FD_ZERO(&set);
FD_SET(sock,&set);
*/
Настраиваю интервал ожидания.
Вызываю select
Если селект вернул не 0 (осталось еще время для ожидания) - тогда в буфер что-то было прочитанно - обрабатываю это.
Если - 0, значит время истекло.

И еще один вопрос в ту же тему. Читать из сокета лучше recv или read? Они вроде бы оба допустимы. Есть ли разнится?

★★★★★


вообще-то, select(2) - это ожидание события на файловом дескрипторе включая сокет. например, его готовность к чтению или записи. как следствие, сперва мы ждём события (вызываем select) а уже потом производим действие (читаем).

// wbr

klalafuda ★☆☆
()

> Вроде работает, но иногда зависает.

Читаешь сколько байт? Чтобы не висло, нужно сокет с SOCK_NONBLOCK создавать (или потом ставить).

mv ★★★★★
()

Правильно сначала вызывать select, потом читать данные(хотя всё зависит от того, что тебе нужно). В этом случае ты сможешь задать максимальный таймаут, который нужно ждать.
Разница между recv и read лишь в том, что для recv можно указать дополнительные параметры. К примеру, можно указать, что необходимо ждать, пока все данные не будут получены, либо запретить SIGPIPE. Более подробно смотри в мане.

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

>Читаешь сколько байт? Чтобы не висло, нужно сокет с SOCK_NONBLOCK создавать (или потом ставить).
Сокет неблокирующийся, преобразован fcntl. А можно сокет сразу неблокирующимся создать?

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

Из man 2 socket:

       Since  Linux  2.6.27,  the type argument serves a second purpose: in addition to
       specifying a socket type, it may include the bitwise OR of any of the  following
       values, to modify the behavior of socket():

       SOCK_NONBLOCK   Set  the  O_NONBLOCK  file  status  flag  on  the  new open file
                       description.  Using this flag saves extra calls to  fcntl(2)  to
                       achieve the same result.

       SOCK_CLOEXEC    Set the close-on-exec (FD_CLOEXEC) flag on the new file descrip-
                       tor.  See the description of the O_CLOEXEC flag in  open(2)  for
                       reasons why this may be useful.

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

>Since Linux 2.6.27.."

>чудесное дополнение. нет уж, лучше дедовским способом, через fcntl(2) или хотя бы setsockopt(2).

>// wbr

Действительно, важная поправка. Тем боле, что я стараюсь зделать все в рамках POSIX, чтоб без проблем переносилось на различные платформы, так что это мне не подойдет.

Еще вопрос в догонку. Для проверки, готов ли сокет для чтения я использую возвращаемой select значение и сравниваю его с 0. Правильно ли это. Видел в некоторых источниках жанглирование переменной fd_set для выяснения готов ли сокет. Сокет у меня там всего один.

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

> Еще вопрос в догонку. Для проверки, готов ли сокет для чтения я использую возвращаемой select значение и сравниваю его с 0. Правильно ли это. Видел в некоторых источниках жанглирование переменной fd_set для выяснения готов ли сокет. Сокет у меня там всего один.

практически, если сокет один, то наверное прокатит. но вообще это идеологически неверно. select() возвращает кол-во (SIC!) дескрипторов, на которых были обнаружены те или иные события. соотв. корректнее пройтись по всему списку дескрипторов и проверить на каждом из них через FD_ISSET готов он к заказанному событию XXX или нет. возврашённое кол-во готовых дескрипторов поможет несколько оптимизировать эту проверку.

// wbr

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

Всем большое спасибо за помощ. Теперь все работает как часы.

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