Написал прогу которая должна собирать пакет и отсылать. Решил протестировать у себя на компе. Сделал вторую прогу-сервер. В общем запустил клиента(спуфер). Сервер не отвечает, как-будто к нему ни кто не коннектится. Написал клиент на простых сокетах, что бы проверить сервак. Сервак работает хорошо, отвечает на запросы клиента на сокетах. Не знаю в чем дело. Может быть я не правильно сформировал пакет. От чего это может зависить. Вот исходный код:
***********************************************************
//Инклуды**********
#include "windows.h"
#include "ras.h"
#include "iostream.h"
#include <process.h>
#include "conio.h"
#define IP_HDRINCL 2
//Структуры**********
struct HEADER
{
int id;
int rd;
int aa;
int opcode;
int qr;
short qdcount;
short ancount ;
short nscount;
short arcount;
int ra;
short tc;
int rcode;
};
struct DNS_MSG
{
HEADER head;
char query[255];
};
struct iphdr
{
unsigned char ihl:4;
unsigned char version:4;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short frag_off;
unsigned char ttl;
unsigned char protocol;
unsigned short check;
unsigned int saddr;
unsigned int daddr;
};
struct udphdr { //Заголовок UDP пакета
unsigned short source;
unsigned short dest;
unsigned short len;
unsigned short check;
};
wsprintf(killer.query,"local"); //Вот здесь надо писать домен который запрашиваем. А что делать на локальном компе. Я решил написать local. Имеет это какое-нибудь значение?
struct dns_pkt dpk;
short src,dst;
dpk.udp.source=htons(2000);
dpk.udp.source=htons(2000);
int len;
len=(12+strlen(killer.query)+5);
dpk.udp.len=htons(20+len);
memcpy(dpk.data,(void*)&killer,len);
dpk.ip.tos=0;
dpk.ip.tot_len=htons(sizeof(dpk)+len);
dpk.ip.frag_off=0;
dpk.ip.ttl=64;
dpk.ip.protocol=IPPROTO_UDP;
dpk.ip.saddr=inet_addr("127.0.0.1");
dpk.ip.daddr=inet_addr("127.0.0.1");
struct sockaddr_in sin;
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(2000);
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
connect(sfd,(PSOCKADDR)&sin, sizeof(sin));
sendto(sfd,(char*)&dpk,sizeof(dpk)+len,0,(struct sockaddr*)&sin,sizeof(sin));
}
***********************************************************
Помогите или хотя бы подскажите в чем дело пожалуйста. Спасибо...
Протестировал строку:setsockopt(sfd,IPPROTO_IP,IP_HDRINCL,(char*)&sfdo,sizeof(sfdo));
возвращает -1.Не знаю в чем дело вреде написана правильно. Нашел на одном .com сайте кусочек кода,там вообще этой строчке не было. Разве так можно она же объявляет опции RAW сокета(говорит то что пакет мы будем формировать сами) или я ошибаюсь. В любом случае я попробовал и без этой строчке, одна хрень не отсылает.
Помогите кто знает.........
Здравствуйте, Laymer, Вы писали:
L>Протестировал строку:setsockopt(sfd,IPPROTO_IP,IP_HDRINCL,(char*)&sfdo,sizeof(sfdo)); L>возвращает -1.Не знаю в чем дело вреде написана правильно. Нашел на одном .com сайте кусочек кода,там вообще этой строчке не было. Разве так можно она же объявляет опции RAW сокета(говорит то что пакет мы будем формировать сами) или я ошибаюсь. В любом случае я попробовал и без этой строчке, одна хрень не отсылает. L>Помогите кто знает.........
Все предельно просто! Надо инициализировать сокеты!!! А у вас в коде я чего то такой вещицы не приметил! И еще про setsockopt — строчка необходима!!! Про исключения умолчу...Если угодил, очень рад!
p.s а когда отлаживались вы не приметили, что socket тоже фигню возвращает ?
Здравствуйте, Pascha, Вы писали: P>Все предельно просто! Надо инициализировать сокеты!!! А у вас в коде я чего то такой вещицы не приметил! И еще про setsockopt — строчка необходима!!! Про исключения умолчу...Если угодил, очень рад!
P>p.s а когда отлаживались вы не приметили, что socket тоже фигню возвращает ?
Здравствуйте, Laymer, Вы писали:
L>Проинициализировал, но результа всеравно нет. L>setsockopt всеравно возвращает -1 . Че с ней делать. Че за...Она же правильно написана...
Здравствуйте, Spider84, Вы писали:
S>GetLatsError()
Нашел с помощью этой функции ошибку. Ошибка номер 10022:
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.
Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...
Здравствуйте, Spider84, Вы писали:
S>GetLatsError()
Нашел с помощью этой функции ошибку. Ошибка номер 10022:
Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.
Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...
Здравствуйте, Laymer, Вы писали:
L>Здравствуйте, Spider84, Вы писали:
S>>GetLatsError()
L>Нашел с помощью этой функции ошибку. Ошибка номер 10022: L>Invalid argument.
L>Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.
L>Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...
Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом
Здравствуйте, icewind, Вы писали:
I>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом
L>Здравствуйте, icewind, Вы писали:
I>>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом
icewind написал так:
************
WSADATA st;
WSAStartup(MAKEWORD(2,2),&st);
//Открываю RAW сокет
SOCKET sfd;
sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //<---Вот здесь как ты говорил заменил
unsigned int sfdo=1;
int hk=setsockopt(sfd,IPPROTO_IP,2 ,(char*)&sfdo,sizeof(sfdo));
if(hk==-1)
{
cout<<"ip_hdrincl denied";
}
****************
Насчет зайти с правами админа, у меня 98 виндоза.
setsockopt всеравно мозга е...т. Не мог ты мне свой кусочек кода с этими строчками скопировать, может я где-то что-то упустил. Ты не представляешь как-бы я тебе был благодарен.
Здравствуйте, Laymer, Вы писали:
L>>Здравствуйте, icewind, Вы писали:
I>>>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом
L>icewind написал так: L>************ L> WSADATA st; L> WSAStartup(MAKEWORD(2,2),&st); L>//Открываю RAW сокет L>SOCKET sfd;
L>sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //<---Вот здесь как ты говорил заменил L>unsigned int sfdo=1; L>int hk=setsockopt(sfd,IPPROTO_IP,2 ,(char*)&sfdo,sizeof(sfdo)); L>if(hk==-1) L>{ L> cout<<"ip_hdrincl denied"; L>} L>****************
L>Насчет зайти с правами админа, у меня 98 виндоза. L>setsockopt всеравно мозга е...т. Не мог ты мне свой кусочек кода с этими строчками скопировать, может я где-то что-то упустил. Ты не представляешь как-бы я тебе был благодарен.
Вот он
WSADATA wsaData;
SOCKET sockRaw;
BOOL bOpt = true;
int ret;