To je čuveni
C10K problem. U principu, nemaš univerzalan odgovor, već optimalno rešenje zavisi od operativnog sistema. Na Windows serverima (kao i na nekim mainframe OS-ovima) treba koristiti IO Completion Ports.
Možda je dobra ideja da pogledaš
ACE - prilično bogatu portabilnu biblioteku za mrežno programiranje - navodno, oni ispod haube koriste optimalno rešenje za svaki OS koji podržavaju. Sa druge strane, ACE je pravi monstrum, pisan u zastarelom C++u, ponekad mi liči na Javu ili C#, hehehe.