Как привязать Raw Socket к определенному порту? - PullRequest
5 голосов
/ 14 февраля 2011

Я сейчас работаю над заданием по программированию.Назначение заключается в реализации клиента, сетевого эмулятора и сервера.Клиент передает пакеты эмулятору сети, а эмулятор сети передает серверу.И наоборот тоже.Обязательным условием для назначения является то, что я могу использовать только необработанные сокеты.Поэтому я создам свои собственные заголовки IP и UDP.Я проверил свои пакеты с Wireshark.Все они правильные и в правильном формате (он читает их правильно).

Другое требование состоит в том, что эмулятор, клиент и сервер имеют определенные порты, к которым они должны быть привязаны.Теперь я не понимаю, как привязать необработанный сокет к определенному порту.Все мои сырые сокеты получают весь трафик на адрес хоста, к которому они привязаны.Согласно страницам руководства, и везде в Интернете, включая «Сетевое программирование Unix» Ричарда Стивенса, именно так они и должны работать.Мой учитель не ответил ни на одно из моих электронных писем, и я, вероятно, не смогу спросить его до вторника. Я вижу два варианта передо мной.Сначала я могу использовать libpcap для фильтрации с определенного устройства, а затем вывести его в мой raw-сокет.Я чувствую, что это выход за рамки нашего задания.Или я могу отфильтровать их после того, как получу их из сокета.Это, очевидно, имеет много накладных расходов, потому что все пакеты копируются / перемещаются через ядро.По крайней мере, это мое понимание (пожалуйста, не стесняйтесь меня поправлять, если я ошибаюсь).

Итак, мой вопрос: это вариант или что-то, что я могу установить для этого?Где необработанный сокет будет привязан к порту?Я что-то упустил очевидное?

Спасибо, что уделили время.

-

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

Справочная страница для raw (7) сообщает:

Необработанный сокет может быть привязан к определенному локальному адресу с помощью вызова bind (2).Если он не связан, все пакеты с указанным протоколом IP принимаются.Кроме того, сокет RAW может быть связан с конкретным сетевым устройством с использованием SO_BINDTODEVICE;см. розетку (7).

Редактировать: Вы не можете привязать необработанный сокет к определенному порту, потому что «порт» является понятием в TCP и UDP, а не IP.Посмотрите на диаграммы заголовков для этих трех протоколов, и это должно стать очевидным: вы работаете на более низком уровне, где концепция порта не известна.

1 голос
/ 14 февраля 2011

Я думаю, вы должны фильтровать пакеты в вашем программном обеспечении.Похоже, что упражнение состоит в том, чтобы узнать, что делают различные компоненты стека IP, воссоздав его упрощенную часть в пространстве пользователя.Обычно в ядре IP-код обрабатывает все пакеты, проверяет заголовки IP, собирает фрагменты и проверяет поле протокола.Если поле протокола равно 17 (udp), то оно передает его в код UDP (каждый пакет UDP).Это зависит от кода UDP, чтобы затем проверить заголовок UDP и определить, заинтересованы ли какие-либо приложения в них на основе порта назначения.

Я предполагаю, что ваш проект должен более или менее имитировать этот процесс.Очевидно, что ничего из этого не будет столь же эффективным, как выполнение в ядре, но так как задание состоит в том, чтобы записать (часть) стека IP в пользовательском пространстве, я бы предположил, что эффективность не в этом.

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