2013-06-07 5 views
1

Мне интересно, насколько это возможно, чтобы конвертировать сокет AF_INET вместо использования AF_UNIX. Причина этого в том, что у меня есть программа, которая откроет TCP-сокет, но который мы не можем изменить. Чтобы уменьшить накладные расходы, мы хотели бы вместо этого связать этот сокет, чтобы вместо него использовать AF_UNIX.Преобразование гнезда AF_INET для использования AF_UNIX через LD_PRELOAD

До сих пор моя идея заключалась в использовании LD_PRELOAD для достижения этого --- перехвата bind() и accept(), однако неясно, как лучше всего это достичь, или даже если это лучший подход.

Пока что bind в bind(), если тип сокета - AF_INET, а его IP/порт - это сокет, который я хочу преобразовать в AF_UNIX, тогда я закрываю sockd здесь и открываю AF_UNIX. Однако, похоже, это вызывает проблемы в accept() - потому что я не уверен, что делать, если sockfd в accept() соответствует той, которую я хочу сказать, чтобы использовать сокет AF_UNIX.

Любая помощь любезно оценена.

Jason

+0

Несмотря на то, что я написал ответ, я нашел этот вопрос плохо подходящим для формата сайта. Я почти проголосовал за то, чтобы закрыть его как «не конструктивный». Проблема в том, что ответ на вопрос «это возможно?». более или менее «да». В будущем я бы предложил задать более прямой вопрос, например вопрос о конкретном аспекте реализации этой оболочки, с которой вы столкнулись. – Celada

+0

Спасибо, Селада. Теперь я изменил вопрос, чтобы быть немного яснее. –

+0

Библиотека [socket_wrapper] (https://cwrap.org/socket_wrapper.html) предоставляет эту функцию. –

ответ

1

Ваша идея звучит совершенно осуществимо. На самом деле, я думаю, это звучит как лучший способ добиться того, чего вы хотите. Я бы не ожидал очень разных или даже существенно отличающихся накладных расходов/производительности.

Конечно, вам также необходимо перехватить socket() в дополнение к bind() и accept(). В bind() вы могли бы, например, преобразовать запрошенный TCP-порт в фиксированный путь /tmp/converted_socket.<port-number> или что-то в этом роде.

+0

Итак ... in socket() Я бы сохранил трек, какие FD были созданы. В bind(), если sockfd, который я нашел, соответствует этому, а IP/порт этого сокета - тот, который я хочу преобразовать , Я затем открываю сокет AF_UNIX с правильным путем и связываю это, а затем конвертируем sockaddr *, переданный в bind()? Что происходит тогда в accept()? –

+0

О, теперь я вижу, что вы хотите отложить решение о том, переписываете ли вы системный вызов 'bind()'. Тогда вам не нужно перехватывать 'socket()', я думаю. Вы можете наживать-и-переключать сокет внутри 'bind()'. В любом случае, в 'accept()' вам нужно будет преобразовать аргумент sockaddr из 'sockaddr_un' в' sockaddr_in' или 'sockaddr_in6'. – Celada

+0

Да, Celada --- Мне нужно было бы отложить это, потому что для большинства других запросов bind() они просто проходят через немодифицированные мной, следовательно, споры в конкретном случае. У вас будет хороший пример того, как достичь этого? Я признаю, что немного борюсь с конверсией. –