2008-09-16 1 views
19

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

Поскольку я нахожусь в Linux, все, что мне нужно, - это объяснение того, как писать сырые сокеты Berkeley. Может кто-нибудь быстро меня убегает?

+1

Разъемы RAW очень сложны и немного отличаются в разных системах. Я знаю, что люди используют их для кодирования снифферов (например, «wirehark») и некоторых довольно тайных диагностических программ. Они, конечно же, не являются хорошим местом для обучения программированию сокетов. В большинстве случаев «я начинаю программист на C++/сетевой администратор» означает «держаться подальше от SOCK_RAW». – 2012-08-28 02:52:18

+0

@ChuckKollars, я не согласен. Я думаю, что изучение сырых сокетов - отличный способ изучения C++, и особенно C. Использование библиотеки - это одно, но сырые сокеты с Linux - это очень проницательный опыт. C++ может делать так много уникальных вещей. Я думаю, что избежать страдания, которое вы подразумеваете, является ошибкой. – motoku 2014-06-22 18:29:26

+0

Какая система у вас есть? Реализация сокетов «Raw» значительно отличается от одной системы к следующей, так что то, что вы узнаете (в основном, в основном о системе, а не о C++), не переносится в другом месте. – 2014-07-05 05:23:46

ответ

5

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

13

Начать чтение Beej's guide on socket programming. Это ускорит процесс написания сетевого кода. После этого вы сможете получать все больше и больше информации от чтения справочных страниц.

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

1

Есть много ссылок на это (конечно, книга Стивенса приходит на ум), но я нашел Beej guide невероятно полезным для начала. Это достаточно мясисто, что вы можете понять, что на самом деле происходит, но это достаточно просто, что вам не требуется несколько дней, чтобы написать «hello world» udp client/server.

1

легко:

#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

3

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

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

6

Для стороне клиента 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; 

Создание сокета и вызова подключения:

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

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

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

Привяжите свой адрес к этому сокету с помощью bind.

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

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

Общая связь:

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

Исходный код пример BSD сокетов:

Вы можете найти хороший пример кода этого в wikipedia.

Дальнейшее чтение:

Я настоятельно рекомендую this book и this online tutorial:

alt text

4:

1

Poster, пожалуйста, уточнить ваш вопрос.

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

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

10

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

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

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

1

Прочитано Unix Network Programming от Richard Stevens. Это обязательно. Он объясняет, как все это работает, дает вам код и даже дает вам вспомогательные методы. Возможно, вы захотите проверить некоторые из его других книг. Advanced Programming In The Unix Enviernment является обязательным для программирования нижнего уровня в Unix. Я больше ничего не делаю в стеке Unix, и stuf из этих книг по-прежнему помогает мне кодировать.

1

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

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

2

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

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

Смежные вопросы