Я знаю, что прошло довольно много времени с тех пор, как вы спросили об этом, но вот мой взгляд на ваш вопрос с точки зрения человека, который уже написал несколько серверов на C.
Если ваш сервер является вашим собственным, полностью зависимым и независимым от других кодов, я бы настоятельно рекомендовал бы вам сделать это однопоточным с неблокирующими сокетами и используя epoll (Linux), kqueue (BSD) или WSAEventSelect (Windows).
Для этого может потребоваться разбить код, который в противном случае был бы «простым», на гораздо более мелкие куски, но если вам нужна масштабируемость, это побьет все серверы на основе потоков / выбора.
Однажды была замечательная статья под названием «Проблема C10K», которая полностью посвящена проблеме обработки 10 000 одновременных соединений. Я действительно многому научился из этого, вот ссылка на него: http://www.kegel.com/c10k.html.
Существует также еще одна замечательная статья, посвященная масштабируемости, которая называется «Масштабируемая сеть», которую вы можете найти здесь: http://bulk.fefe.de/scalable-networking.pdf.
Эти два отличных чтения, надеюсь, это поможет.