Для простой переадресации сокетов пусть это сделает ядро. Используйте iptables или один из интерфейсов для его настройки.
Если вам нужно сложное обнюхивание/перетаскивание данных/пересылка для использования в реальном мире, напишите модуль iptables.
Если вам нужно выполнить тикет (дублировать/разделить) поток данных или просмотреть или изменить данные, тогда прочитайте дальше.
Linux 2.6.17 и более поздние версии, с glibc 2.5 и более поздними версиями, предоставляют несколько приятных функций: splice()
и tee()
. Вы можете использовать их, чтобы избежать использования полезной нагрузки, скопированной в и из пользовательского пространства, в которой ядро передало определенное количество байтов из одного дескриптора в другой. (tee()
не использует данные, позволяющие отправлять одну или несколько копий данных другим дескрипторам.)
Вы можете использовать два потока для каждого соединения (по одному на каждое направление)/tee поток данных по мере необходимости.Когда вы знаете, у вас есть N входящих байтов для пересылки на один исходящий сокет, используйте splice()
. Если у вас более одного исходящего сокета, используйте неблокирующие исходящие сокеты, tee()
небольшие куски за раз (но используйте splice()
для последнего исходящего сокета для каждого фрагмента).
Ваши темы можно прочитать некоторые/все входящие данные, чтобы решить, что делать с ним, но помните, что вам нужно write()
или send()
часть, которую вы уже прочитали, что нужно отправить, перед использованием splice()
или tee()
; они не волшебным образом собирают уже потребляемые данные.
Зачем создавать два новых потока при входящих соединениях? Одного достаточно, и он может выполнять как отправку, так и прием с обоих соединений. Читайте о неблокирующих сокетах и системном вызове 'select'. –
Что именно вы подразумеваете под чем-то более простым? Сокет не делает ничего волшебного самостоятельно, вам нужно вручную запрограммировать прием и переадресацию трафика. Существует несколько открытых прокси-серверов открытого типа, таких как кальмары. Но они в основном веб-прокси. Не будет работать ни для каких подключений tcp, а скорее для HTTP. – fayyazkl