Если я правильно понимаю, «connect» возвращается только после того, как сервер «принимает» на слушающем сокете. Я что-то здесь упускаю?
Да. TCP устанавливает соединение - трехстороннее рукопожатие - под одеялом и помещает его в завершенную очередь соединений, когда оно будет готово. Accept () возвращает следующее ожидающее соединение с начала этой очереди.
С точки зрения клиента, он «подключен», но не будет ни с кем разговаривать, пока сервер не примет и не начнет обработку. Вроде как, когда вы звоните в компанию и сразу же ставитесь в очередь ожидания. Вы «подключены», но никакого дела не будет, пока кто-то на самом деле не поднимет трубку и не начнет говорить.
Возможно, ваш отдельный поток умер, но процесс все еще жив, а дескриптор файла все еще открыт, поэтому TCP не знает, что происходит на уровне приложения.