Такая вот задача:
(система : юниксовая)
Есть около 3000 сокетов, на любой из них могут приходить данные, либо коннекшн может разорваться.
Какие предложения, как управлять всеми сокетами одновременно?
соответсвенно надо вызывать select для проверки по timeout-у.
Нерациональный способ: создать 3000 потоков и дать каждому потоку по сокету.
Этот способ жрёт много памяти и так далее.
Кто-нибудь знает более оптимизированный алгоритм?
Здравствуйте, oxenus, Вы писали:
O>Есть около 3000 сокетов, на любой из них могут приходить данные, либо коннекшн может разорваться.
O>Какие предложения, как управлять всеми сокетами одновременно?
O>соответсвенно надо вызывать select для проверки по timeout-у.
Так в чем проблема, последний параметр в select как раз и есть таймаут. Задай его в соответствующее значение и все. Индивидуальные таймауты по последней операции гнезда храни в каком-нибудь списке/массиве.
Вообще говоря, 3000 гнезд — это много, тем более на процесс. Возможно, стоит посмотреть реализацию Apache — там создается несколько процессов и входящие соединения распределяются между ними.
Здравствуйте, Алексей Мартынов, Вы писали:
АМ>Здравствуйте, oxenus, Вы писали:
O>>Есть около 3000 сокетов, на любой из них могут приходить данные, либо коннекшн может разорваться.
O>>Какие предложения, как управлять всеми сокетами одновременно?
O>>соответсвенно надо вызывать select для проверки по timeout-у.
АМ>Так в чем проблема, последний параметр в select как раз и есть таймаут. Задай его в соответствующее значение и все. Индивидуальные таймауты по последней операции гнезда храни в каком-нибудь списке/массиве.
АМ>Вообще говоря, 3000 гнезд — это много, тем более на процесс. Возможно, стоит посмотреть реализацию Apache — там создается несколько процессов и входящие соединения распределяются между ними.
... а с другой стороны — thttpd — очень простой, легкий и надежный веб-серверок, как раз написан без fork-ов — и просто хранит массив сокетов и обрабатывает все что есть в одном процессе ..