Здравствуйте, Kemm, Вы писали:
K>Здравствуйте, Anokhov, Вы писали:
VDB>>>Да, и еще. То, что connect() происходит в блокирующем режиме — так и задумано?
A>>Не совсем
но, насколько я понимаю, fcntl надо вызывать сразу после connect?
K>А как тогда connect() может не заблокироваться, если сокет не переведен в неблокирующий режим? 8)) Как раз наоборот -- сразу после создания клиентского сокета.
Верно.
A>>В общем мой вариант, описанный выше, работает, с одной доработкой. Я &readset очищаю и заполняю каждый раз в цикле перед вызовом Select заново. Нигде в документации я не смог найти, почему так. Но по тестам у меня получилось, что Select после того, как срабатывает, очищает &readset? Или может он удаляет из него все дескрипторы, которые не сработали? Подскажите, что в действительности происходит?
K>Кстати, да. Я не обратил внимания на работу с fd_set. В мане же написано:
K>On return, select() replaces the given descriptor sets with subsets consisting of those descriptors that are ready for the requested operation.
K>Иначе бы FD_ISSET() и не работал бы. 8)) Поэтому обычно все обнуляется и заполняется заново.
Мало того, я бы еще для бОльшей переносимости (если это нужно), и значение тайм-аута советовал бы заново заполнять.
Не все реализации оставляют его неизменным.