В соединении отказано не потому, что вы звоните, принимаете поздно, а потому, что вы звоните, слушаете поздно. Убедитесь, что вы звоните прослушивать, прежде чем любые вызовы подключения (вы можете проверить с помощью strace). Это, вероятно, требует, чтобы вы слушали, прежде чем вырастить каких-либо детей.
После вызова прослушивания на сокете входящие соединения будут стоять в очереди до тех пор, пока вы не вызовете accept. В какой-то момент еще не принятые соединения могут быть сброшены, но это не должно происходить только с 2 или 3 сокетами.
Если это Unix, вы можете просто использовать pipe2 или socketpair, чтобы создать пару соединенных сокетов pipe / unix domain с намного меньшим количеством кода. Конечно, вам нужно сделать это, прежде чем порождать дочерний поток и передать один конец дочернему потоку.