Как мне создать пакеты RAW TCP / IP в C ++? - PullRequest
19 голосов
/ 17 сентября 2008

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

Поскольку я работаю в Linux, все, что мне нужно, это объяснение того, как писать необработанные сокеты Беркли. Кто-нибудь может дать мне быстрый бег вниз?

Ответы [ 11 ]

13 голосов
/ 17 сентября 2008

Начните с чтения Руководство Биджа по программированию сокетов . Он научит вас, как начать писать сетевой код. После этого вы сможете получать все больше и больше информации, читая справочные страницы.

Большая часть будет состоять из чтения документации для вашей любимой библиотеки и базового понимания man-страниц.

10 голосов
/ 17 сентября 2008

Для начала было бы полезно, если бы вы пояснили, что вы подразумеваете под «сырым». Традиционно это означает, что вы хотите создать весь заголовок уровня 4 (заголовок TCP / UDP / ICMP ...) и, возможно, некоторые заголовки IP самостоятельно. Для этого вам понадобится больше, чем учебник Биджа, который уже упоминался здесь. В этом случае вы хотите получить необработанные IP-сокеты, используя аргумент SOCK_RAW в вашем вызове сокета (см. http://mixter.void.ru/rawip.html для некоторых основ).

Если вы действительно хотите установить TCP-соединение с каким-либо удаленным хостом, таким как порт 80 на stackoverflow.com, то вам, вероятно, не нужны «сырые» сокеты, и руководство beej вам пригодится.

Для получения авторитетного справочного материала по этому вопросу вам стоит обратиться к «Сетевое программирование Unix», том 1: API-интерфейс для работы с сокетами (3-е издание), автор Stevens et al.

6 голосов
/ 17 сентября 2008

Для TCP-клиента:

Используйте gethostbyname для поиска DNS-имени по IP, он вернет структуру hostent. Давайте назовем это возвращаемое значение хостом.

hostent *host = gethostbyname(HOSTNAME_CSTR);

Заполните структуру адреса сокета:

sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(REMOTE_PORT);
sock.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;

Создайте сокет и вызовите connect:

s = socket(AF_INET, SOCK_STREAM, 0); 
connect(s, (struct sockaddr *)&sock, sizeof(sock))

Для стороны сервера TCP:

Настройка сокета

Свяжите свой адрес с этим сокетом, используя bind.

Начните слушать на этом сокете с прослушивания

Позвоните, чтобы принять подключенного клиента. <- в этот момент вы создаете новый поток для обработки соединения, в то время как вы делаете еще один вызов для подтверждения получения следующего подключенного клиента. </p>

Общая информация:

Используйте send и recv для чтения и записи между клиентом и сервером.

Пример исходного кода сокетов BSD:

Хороший пример кода вы можете найти в wikipedia .

Далее:

Я настоятельно рекомендую эту книгу и этот онлайн-учебник :

alt text

4 :

5 голосов
/ 17 сентября 2008

Хорошее место для начала было бы использовать Asio , которая является отличной кроссплатформенной (включая Linux) библиотеку для сетевого взаимодействия.

3 голосов
/ 17 сентября 2008

Вы делаете это точно так же, как в обычном C, в C ++ нет специального способа сделать это в стандартной библиотеке.

Учебное пособие, которое я использовал для изучения этого, было http://beej.us/guide/bgnet/. Это было лучшее учебное пособие, которое я нашел после осмотра, оно дало четкие примеры и хорошее объяснение всех описанных функций.

2 голосов
/ 07 февраля 2013

Я разрабатывал libtins за последний год. Это высокоуровневая библиотека C ++ для обработки и анализа пакетов.

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

1 голос
/ 27 февраля 2009

Libpcap позволит вам создать завершенные пакеты (от уровня 2 до уровня 7) и отправить их по проводам. Как бы забавно это ни звучало, есть некоторые оговорки. Вам нужно создать все соответствующие заголовки и выполнить всю контрольную сумму самостоятельно. Libnet может помочь с этим, однако.

Если вы хотите выйти из пула программирования C ++, есть scapy для python. Это упрощает создание и передачу пакетов TCP / IP.

1 голос
/ 17 сентября 2008

Чтение Сетевое программирование Unix Ричард Стивенс. Это обязательно. Он объясняет, как все это работает, дает вам код и даже дает вспомогательные методы. Возможно, вы захотите проверить некоторые из его других книг. Расширенное программирование в Unix Enviernment является обязательным условием для программирования более низкого уровня в Unix. Я даже больше ничего не делаю в стеке Unix, и материал из этих книг по-прежнему помогает мне кодировать.

1 голос
/ 17 сентября 2008

Плакат, пожалуйста, уточните свой вопрос.

Почти все ответы, кажется, думают, что вы просите учебник по сокетам; Я прочитал ваш вопрос, чтобы обозначить, что вам нужно создать необработанный сокет, способный отправлять произвольные IP-пакеты. Как я уже говорил в моем предыдущем ответе, некоторые ОС ограничивают использование необработанных сокетов.

http://linux.die.net/man/7/raw «Только процессы с эффективным идентификатором пользователя 0 или возможностью CAP_NET_RAW могут открывать необработанные сокеты.»

1 голос
/ 17 сентября 2008

легко:

#include <sys/socket.h>
#include <sys/types.h>

int socket(int protocolFamily, int Type, int Protocol)
// returns a socket descriptor

int bind(int socketDescriptor, struct sockaddr* localAddress, unsigned int addressLength)
// returns 0 

... и т.д.

это все в sys / socket.h

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