Возможно, вы достигли предела вашего процесса для открытых файловых дескрипторов.
Я не уверен, правильно ли я вас понимаю: у вас есть и серверная, и клиентская стороны в одном и том же процессе? Тогда вы будете использовать в два раза больше файловых дескрипторов. Это близко к тому, что вы видите с ulimit. Если это не так, может ли проблема быть на стороне сервера? Возможно, процесс сервера исчерпал дескрипторы и больше не может принимать больше соединений.
Страница man accept упоминает, что вы должны получить возвращаемое значение:
EMFILE
Достигнут лимит для каждого дескриптора открытого файла.
ENFILE
Достигнуто системное ограничение на общее количество открытых файлов.
Какой код ошибки вы получаете? Очевидно, что вы можете добавить только те соединения, которые были успешно _accept_ed, в select или poll .
Я знаю, что вы уже знаете, как проверить ulimit , но другие не могут:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 40448
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 4096
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 40448
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited