2009-02-02 6 views
2

Можно ли подключить два разъема?Соединение 2 розетки?

Например, если процесс действует как маршрутизатор сообщений между двумя другими процессами, в какой-то момент, способным отступить, это спасет кучу сокета IO. Это похоже на то, что это должно быть возможно, но я никогда не слышал об этом!

Если возможно, возможно ли это на Linux и Windows? Если это так, разные механизмы, используемые для его настройки?

BTW: Я только что нашел это:

Linux splice() system call.

Это кажется близко к тому, что я прошу (если, конечно, это работает на гнездо FD, как хорошо), но есть эквивалент для Windows?

ответ

2

AFAIK, это невозможно.

Простой пример: если ваши процессы выполняются на трех разных машинах, как прокси-машина может отступить в сторону без привлечения перенаправления трафика на TCP/UDP/любом уровне?

сплайсинг не является решением, он просто оптимизирует передачу ввода-вывода, избегая ненужных копий памяти, но в любом случае вам нужен процесс, который циклически вставляет и соединяет соединение для передачи данных на выход (и если сокеты - это настоящие сетевые сокеты, данные должны проходить через сетевую карту дважды).

LLP, Андреа

+0

После того, как я опубликовал это, я понял, что для этого потребуется поддержка на уровне tcp/ip ... Если маршрутизатор может отправить некоторый внеполосный пакет клиенту, который сказал, что «легко переключить все адреса назначения на xxxx для этот сокет "... тогда это сработает ... – dicroce

1

Короткий ответ Нет.

Немного более длинный ответ В целом. Системный вызов splice() специфичен для Linux и не определен для сокетов. Если для сокетов были установлены, то это был бы способ подключения файла с отображением памяти в или из сокета потока. Это не было бы двунаправленным. Боги знают только то, что существует в Windows в этой области.

Ответ на чрезмерное Geeky: Ну, вы могли бы расширить ядро ​​ОС, но ... это может быть не то, что вы хотите. Если ни один из удаленных адресов двух сокетов или PF_INET6 не является узловым, то маршрутизатор по-прежнему будет пересылать пакеты между двумя удаленными узлами, каждый из которых имеет 5-кортеж сокета, который ссылается на ваш хост маршрутизатора. И нет, я буду не объяснить темные искусства обмана ARP/ND6, чтобы обойти эту проблему.

1

Я запрограммировал что-то подобное в прошлом. Предполагая, что вы программист для всех трех процессов, это возможно, но сложно. Если у вас есть соединение сокетов A и соединение сокетов B, вы берете информацию от A, отправляете ее в B и отправляете B запрос на соединение на A. Это потребует немного кодирования, но оно должно работать. Это было для меня. Надеюсь, что это работает! Удачи!