Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Raw sockets, C++  (Прочитано 2680 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн k33

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Raw sockets, C++
« : 15 Май 2010, 18:33:49 »
Здравствуйте, коллеги!

Жизнь моя дала большую трещину - стоит предо мной непосильная задача. Необходимо на слабо знакомом мне C++ в течение 2-х недель написать приложение (клиент + сервер), которое будет создавать нестандартные ситуации в обмене пакетами по IPv4 (это нужно для лабораторных работ студентов). При этом рекомендовано использование raw socket-ов. Пример нестандартной ситуации - "оборванное" тройное рукопожатие:

[C] => Sin;
=> [C] Sin+Ack;
А ответный Ack не приходит.

Студенты с помощью tcpdump'а или любого другого снифера будут сидеть и смотреть на поведение сети во время всего этого безобразия.  :)

Моя проблема состоит, главным образом, в том, что не могу найти нормального чтива по raw socket'ам. Мне посоветовали Стивенса - но там я не нашёл raw socket'ов (или не понял, что это они :)). Более-менее адекватный мануал по самим функциям нашёл на opennet, но этого не достаточно. :(

Буду благодарен любым советам. :)
Ci vis pacem, para bellum.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Raw sockets, C++
« Ответ #1 : 15 Май 2010, 19:31:38 »
Очень неудобно читать пост. Не стоит передёргивать с оформлением.

Попробуй задать более конкретный вопрос. Если ты спросишь: "Как мне открыть для прослушивания порт и принимать на нём входящие соединения?" - то больше шансов получить вменяемый ответ. Если приведёшь выдержки кода которые не работают с объяснением что именно хотелось получить, то ещё лучше будет.

Оффлайн k33

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Raw sockets, C++
« Ответ #2 : 16 Май 2010, 01:06:20 »
Я не знаю, как с помощью raw socket'а полностью сформировать пакет и втолкнуть его в сокет. Нужно, чтобы я мог сформировать пакет на уровне ip-заголовков, флагов и всего прочего. Ну и, естественно, получить. Таким образом, за мной будет и возможность посылать ack и т.п. Это реально или я что-то не понимаю?
Ci vis pacem, para bellum.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Raw sockets, C++
« Ответ #3 : 16 Май 2010, 16:52:06 »
В принципе это возможно. Попробуй почитать вот это: http://mixter.void.ru/rawip.html Вроде бы человек пишет именно о том что ты хочешь.

P.S. Сам я столь низкоуровневой работой с сетью никогда не занимался.
« Последнее редактирование: 17 Май 2010, 00:34:28 от VestniK »

Оффлайн k33

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Raw sockets, C++
« Ответ #4 : 17 Май 2010, 00:29:32 »
VestniK,
при беглом рассмотрении показалось, что это именно то, что нужно. Обязательно прочитаю статью, спасибо! :)


Пишу сюда же, так как немного разобрался в теме - наверняка кто-нибудь ещё будет искать, а материала почти нет в сети.

Для реально "сырой" отправки пакетов и вправду сгодится традиционный socket( ..., SOCK_RAW, IPPROTO_TCP ); Ссылка на статью с этим делом в начале этого топика есть.
Но вот со сниффингом (низкоуровневым перехватом) пакетов дело обстоит чуть сложнее.
С помощью recv() или read() мы можем получить данные, которые пересылаются в пакете. Но ip-, tcp-, udp- и прочие заголовки мы получить не сможем. Для этого надо "отнимать" пакет у сетевого интерфейса, у самой карточки. Это поможет сделать библиотека libpcap (для *nix) и winpcap (для неверных :)). Почитать о кодинге под *nix можно тут: http://yuba.stanford.edu/~casado/pcap/section1.html


Столкнулся с новой проблемой.

Пакет вроде отправляется, но почему-то без TCP-заголовка. Подозреваю, что всему виной моё поверхностной знание C.

tcpdump:
(Нажмите, чтобы показать/скрыть)

Код:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 24 Май 2010, 08:44:51 от Владимир Николаевич »
Ci vis pacem, para bellum.

 

Страница сгенерирована за 0.056 секунд. Запросов: 24.