Я хорошо помню, что файловый дескриптор проходил только через сокеты Unix Datagram, а не через сокеты Unix. Это также может потребовать повторной отправки. Ваш пример слишком велик (и я слишком ленив) для правильного анализа, но посмотрите здесь для альтернативного примера кода. Я сам использовал этот пример на FreeBSD и Linux, он работает.