Как я создаю НЕОБРАБОТАННЫЕ пакеты TCP/IP в C++?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

19
задан Mike Pennington 22 November 2012 в 13:58
поделиться

10 ответов

Запустите путем чтения руководство Beej по программированию сокета. Это принесет Вам до скорости о том, как начать писать сетевой код. После этого необходимо смочь поднять все больше информации с чтения страниц справочника.

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

13
ответ дан 30 November 2019 в 03:03
поделиться

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

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

Для авторитетной ссылки на предмете, необходимо действительно взять Сетевое программирование Unix, Объем 1: Сокеты Сетевой API (3-й Выпуск) Stevens и др.

10
ответ дан 30 November 2019 в 03:03
поделиться

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

Установка сокет

Связывает Ваш адрес с тем использованием сокета, связывают.

Начинают слушать на том сокете с, слушают

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

Общая коммуникация:

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

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

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

Дополнительные материалы для чтения:

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

alt text

4 :

6
ответ дан 30 November 2019 в 03:03
поделиться

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

5
ответ дан 30 November 2019 в 03:03
поделиться

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

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

3
ответ дан 30 November 2019 в 03:03
поделиться

Существуют тонны ссылок на этом (конечно, книга Stevens приходит на ум), но я нашел руководство Beej быть невероятно полезным для начала работы. Это является достаточно мясистым, что можно понять то, что действительно происходит, но это достаточно просто, который Вам не требуются нескольких дней для записи 'привет мир' udp клиент/сервер.

1
ответ дан 30 November 2019 в 03:03
поделиться

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

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

1
ответ дан 30 November 2019 в 03:03
поделиться

Плакат, разъясните свой вопрос.

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

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

1
ответ дан 30 November 2019 в 03:03
поделиться

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

1
ответ дан 30 November 2019 в 03:03
поделиться

легкий:

#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

1
ответ дан 30 November 2019 в 03:03
поделиться