После некоторых испытаний я обнаружил, что это проблема с URL-адресом изображения. URL изображения содержит https. Когда я использую URL изображения с http вместо https, он работает нормально, и спасибо ребятам за ваши усилия и предложения.
Выгода - то, что fd_set не является действительно "набором" в способе, которым Вы думаете. Закулисная деталь - то, что реализация fd_set является просто целым числом, которое используется в качестве битового поля. Другими словами, выполнение
fd_set foo;
FD_CLEAR(&foo);
FD_SET(&foo, 3);
Нечто наборов к десятичному значению 8 - это устанавливает бит fourth-least-singificant на 1 (помните, что 0 допустимый дескриптор).
FD_SET(&foo, 3);
эквивалентно
foo |= (1 << 3);
Таким образом для выбора, чтобы работать правильно, это должно знать, какие биты fd_set являются битами, о которых Вы заботитесь. Иначе не было бы никакого пути к нему для сообщения нулевого бита, который находится "в" наборе, но наборе ко лжи от нулевого бита, который является "не в" наборе.
В Вашем примере, fd_set с 4, 8, и 9 наборов и n = 10 интерпретируется как "Набор с 10 записями (fds 0-9). Записи 4, 8, и 9 верны (контролируйте их). Записи 1,2,3,5,6,7 являются ложью (не контролируйте их). Любое значение fd, больше, чем 9, находится просто не в период набора".
Выбор контролирует те FDs, которые Вы позволили использовать макрос FD_SET. Если Вы не включаете FD для контроля, выберите (), не контролирует никого.
"nfds" определенно избыточен, но это - часть выбора () интерфейс, таким образом, необходимо использовать его :)
Так или иначе, если Вы имеете {4, 8, 9} в наборе, Вы устанавливаете nfds на 10 (как Вы упомянули), и выберите (), будет только контролировать три FDs 4, 8 и 9.
Это - вероятно, оптимизация так, чтобы select
не должен идти через целое fd_set
узнать, какие дескрипторы на самом деле используются. Без того параметра, select
должен был бы всегда смотреть на полный набор для нахождения, какие дескрипторы на самом деле используются в вызове с параметром, часть той работы может быть опущена.