Проблема. Создаю сокет invoke socket, AF_INET, SOCK_RAW, IPPROTO_TCP. Собираю TCP пакет, перед отправкой имеет вид 04 00 00 50 07 AA 50 4D 00 00 00 00 70 02 40 00 F3 B5 00 00 02 04 05 B4 01 01 04 02 После исполнения send_to с данным пакетом получаю ошибку WSAEAFNOSUPPORT (0000273F)
Ты бы лучше показал как именно ты создаешь пакет (кодом). Именя полей проще понять, чем набор цифр (который надо вдобавок поместить в анализатор трафика) .
Я сомневаюсь что мой код тебе поможет ибо я помеща примерно так: mov word ptr [edi+2], ax А по полям ща разложу: 04 00 - порт отправителя 00 50 - получателя 07 AA 50 4D - Sequence number (random) 00 00 00 00 - Acnowledgment 70 - size of head 02 - flag SYN 40 00 - Window F3 B5 - chek sum 00 00 - Urgent point 02 04 05 B4 01 01 04 02 - option data
Ну вроде Заголовок верный ... (см картинку.. на чексумму не смотри - я просто вставил твой заголовок TCP в рандомный IP пакет ) Может быть проблема не в содержимом TCP Header .. так как эта ошибка обычно означает что семейство адресов не поддерживается семейством портов. Если я не ошибаюсь RAW не могут быть TCP _1577850460__пакет.JPG
Сделать сокет SOCKET_STREAM / либо самому собрать пакет (заполняя все заголовки Ethernet , IP, TCP (а может и больше в зависимости от архитектуры сети)) и послать его как есть.
ПО поводу послать.. посмотри статью мою. Я собираю пакет по частям. Вот и ты таким же образом собери SYN пакет. И пошли. (толку от этого в TCP соединении все равно не будет А сниффер всеми любимый Ethereal
с SOCK_RAW идет только IPPROTO_IP и IPPROTO_ICMP, сам прогу писал узнал про этот облом, без kernel наверно не обойтись, или есть еще какой-нибудь способ?
Что именно ты хочешь сделать ?? послать пакет 1 или создать полноценное соединение ? С помощью сырых сокетов у тебя TCP соединение не выйдет никогда. (если конечно ты не собираешься переделывать реализацию)
Блин, да при чем тут ограничения ? Просто сама реализация RAW сокетов не позволяет создавать TCP соединение.
Пардон ребят, я был не прав. Подумал немного, проверил и понял, что можно послать TCP пакет средствами RAW socket. Необходимо создать сокет так s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW,NULL,0,0); а так же сделать setsockopt(s, IPPROTO_IP, IP_HDRINCL,..); Тогда все будет работать. Но в некоторых случаях это работать не будет. Например, если сеть построена на архитектуре PPPoE.