Кусочек вывода strace:select(1045, [16 1044], [1040], [], {0, 148319}) = 2 (in [16 1044], left {0, 148319})
read(16, 0xbf85241c, 4096) = -1 EAGAIN (Resource temporarily unavailable)select говорит, что на двух сокетах (16 и 1044) есть готовые данные для чтения. Сразу же после этого, из 16-го сокета пытаемся читать и получаем отказ, что данных нет. Как такое может быть?
>Кусочек вывода strace:
>
>select(1045, [16 1044], [1040], [], {0, 148319}) = 2 (in [16 1044],
>left {0, 148319})
>read(16, 0xbf85241c, 4096)
> = -1 EAGAIN (Resource temporarily unavailable)
>
>select говорит, что на двух сокетах (16 и 1044) есть готовые данные
>для чтения. Сразу же после этого, из 16-го сокета пытаемся читать
>и получаем отказ, что данных нет. Как такое может быть?А Вы FD_ISSET проверьте, чтобы наверняка.
>select говорит, что на двух сокетах (16 и 1044) есть готовые данные
>для чтения.select говорит что операция чтения/записи не будет заблокирована! А вовсе не то что данные будут прочитаны или записаны.
В твоём случае, похоже на конец файла/закрытия сокета. То есть, select тебе предлагает прочитать, чтобы узнать что это конец.