Необработанный сокет для протокола транспортного уровня - PullRequest
0 голосов
/ 10 июля 2019

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

Мне удалось получить пакеты на сервере, используя

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))

, но не удалось создать клиента, который может отправлять данные на сервер.(Я даже не уверен, является ли вышеуказанный сокет L2 или L3)

Из того, что я понял из чтения необработанных сокетов, сокет L3 будет выглядеть так:

socket(AF_INET, SOCK_RAW, protocol)

Дело в том,Я не знаю, что заполнять для протокола, если я собираюсь создать свой собственный, а не использовать существующие.(Я испробовал многие из номеров iana, включая диапазон 143-252)

Итак, вопрос в том, как создать сокет, сервер и клиент на стороне, поверх интернет-протокола, чтобы два компьютера моглиобщаться по произвольному протоколу (или отправлять данные друг другу)?Другими словами, я хочу указать конечный IP-адрес и полезную нагрузку, а сокет позаботиться о заголовке IP.

Что у меня сейчас есть:

server.cpp: https://pastebin.com/yLMFLDmJ

client.cpp: https://pastebin.com/LWuNdqPT

1 Ответ

0 голосов
/ 10 июля 2019

Для тех, кто ищет, вот решение, которое я нашел: http://www.pdbuchan.com/rawsock/rawsock.html

В файле tcp4.c на вышеупомянутой странице есть реализация клиента с использованием необработанного сокета. Код добавляет заголовки IP и TCP, но вы можете просто удалить строки, в которые добавляются заголовки TCP, и заменить их собственным протоколом. Вам также необходимо изменить эту строку: iphdr.ip_p = IPPROTO_TCP на iphdr.ip_p = 200 (200 или любое число в диапазоне 143-252; см. https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) и задать имя интерфейса, который вы используете, а также изменить адреса.

Итак, вот урезанная версия с упомянутыми изменениями, которая отправляет IP-пакет, содержащий только заголовки IP: https://pastebin.com/z2sGmtQd

А вот очень простой сервер, который может принимать эти пакеты: https://pastebin.com/jJgZUv5p

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