Присоединение 2 сокетов? - PullRequest
       13

Присоединение 2 сокетов?

2 голосов
/ 02 февраля 2009

Можно ли соединить две розетки?

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

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

Кстати: я только что нашел это:

Системный вызов Linux splice ().

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

Ответы [ 3 ]

2 голосов
/ 02 февраля 2009

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

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

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

ТОО, Андреа

1 голос
/ 25 ноября 2012

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

1 голос
/ 27 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...