Как правило, вы не можете передавать соединения от одного процесса другому, за исключением одного: при разветвлении дочерний процесс наследует все соединения от родительского. Обычная операция fork оставляет дочерний файл с тем же набором файловых дескрипторов, что и родительский, и все открытые сокеты включаются в этот набор. Однако это однократная операция, поскольку новые файловые дескрипторы будут создаваться только в контексте одного процесса.
Вам, вероятно, придется прокси, чтобы это сработало, но это не будет сумасшествием. Вам просто понадобится способ для внешнего процесса запросить соединение, использовать соединение, а затем освободить соединение в пул. Это может быть выполнено в стиле FTP, когда вы общаетесь в одном сокете, а второй действует как канал данных.
Это не так сложно, как кажется. Вы можете создать сокет UNIX с именем «proxy.sock» и подключить к нему клиентов. Одна команда может запросить соединение с конкретным FTP-адресатом и получить путь назад, например «ftp.example.com.sock», который можно использовать для подключения к этому месту. Соединение одного потокового сокета с другим не очень сложно в этот момент, и определение, когда сокет закрыт на локальном конце, является обычной процедурой.
Сокеты UNIX могут быть более удобными, чем сокеты TCP, поскольку вам не придется беспокоиться о распределении или исчерпании номеров портов.