Вам понадобится процесс пользовательского пространства, чтобы торчать и копировать данные из одного сокета в другой. Это довольно просто:
- Любые данные
read
от розетки A, write
до розетки B;
- Любые данные
read
от розетки B, write
до розетки A;
- Если
read
возвращает 0 для сокета A, вызовите shutdown(SHUT_WR)
для сокета B;
- Если
read
возвращает 0 в сокете B, вызовите shutdown(SHUT_WR)
в сокете A;
- Как только оба сокета вернули 0 из чтения,
close
оба сокета и выход;
- Если один из сокетов возвращает
EPIPE
, close
оба сокета и выход.
Как упоминает Newton Falls , вы можете использовать splice()
, чтобы сделать это без копирования, но это всего лишь повышение производительности; сначала запустите read
/ write
. Вы должны быть в состоянии просто fork()
отучить ребенка, чтобы сделать это, что заставит его «выстрелить и забыть» для вашего основного процесса.