Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.32.230] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата Columbo @ Переписал exe-шники в одельную папку (до этого запускал просто из билдера): релиз, релиз с библиотеками, дебаг - все программы зависают на передаче. Стабильность ошибки позволяет надеяться на ее локализацию. Цитата Columbo @ Причем тут броадкаст тоже не понятно, хотя я где то читал что для RAW сокетов эта опция нужна. Нет. Эта опция совершенно не нужна. Зачем? |
Сообщ.
#17
,
|
|
|
Columbo, попробуй так:
... int err = bind(hSocket, (sockaddr*)&sockAddrHost, sizeof(sockAddrHost)); ... |
Сообщ.
#18
,
|
|
|
Нашел где то в кодах такую идею:
sendto(s, buf, sizeof(ICMP_HDR)+32, 0, (SOCKADDR *)&dest, sizeof(dest)); |
Сообщ.
#19
,
|
|
|
ну, господа туманные ежи.. Мы работаем с raw sockets. Это автоматически обозначает, что мы должны формировать заголовок ip, потом все остальное ipheader = (struct ip_header*)packet; icmp = (struct icmp_echo*)(packet+sizeof(struct ip_header)); ну и далее, ipheader->ver = 4; /*IPv4*/ ipheader->hl = 5; /* This is the smallest possible value, our IP header is only 20 bytes */ ipheader->tos = 0; ipheader->totl = sizeof(struct ip_header)+sizeof(struct icmp_echo); и понеслась по кочкам метла, в свою очередь, Цитата icmp->type = 8; /* icmp echo */ icmp->code = 0; /* only valid value for echo or echo reply */ icmp->identifier = 0x1337; icmp->sequence = ... ну и естественно, заполнить датой и посчитать чексумму, и будет полный порядок. Ро Сокет не знает в твоей ситуации, куда и что там нужно отправлять. Ты ему даешь охинею из байтов, от которой у винды несварение даты. Возьми нормальный базовый пример и исходя из него, строй приложение. Добавлено вот пример icmp под мелкософт если чо http://www.vijaymukhi.com/security/network/rawsockets.htm попробуй сначала собери консольную аппликацию под студией или своим древним как говно мамонта борландом, потом переходи к формам-кнопкам, иначе будешь неделю какать кирпичами и соберешь на форуме вокруг себя толпу телепатов (что уже сделано) |
Сообщ.
#20
,
|
|
|
nemez а я думал ip заголовок формируется автоматически... Ну если это не так, почему все же удается посылать и принимать пакеты, ну за исключением описаных мною ситуаций, когда функция возвращает ошибку?
Добавлено ЫукпШ, Oleg2004 не помогло.. На другом компе фокус с биндингом и броадкастом не удался.. еще хуже стало - просто зависает программа. |
Сообщ.
#21
,
|
|
|
Цитата Columbo @ ЫукпШ, Oleg2004 не помогло.. На другом компе фокус с биндингом и броадкастом не удался.. еще хуже стало - просто зависает программа. Где-то выход за границы массива или портится стек. Или вместе. Это может быть где угодно в программе, а проявиться именно в этом месте. Легче начать другой проект сначала и по-проще - какой-нибудь консольный вариант исключительно для отладки класса. И двигаться мелкими шажками. |
Сообщ.
#22
,
|
|
|
ЫукпШ Вот я убрал из прогаммы обновление Label->Caption, точнее даже не убрал а просто убрал пару строк оттуда и прекрасно обменивался пакетами без ошибок. И какова вероятность того что в консольном варианте, где нет ничего лишнего все будет работать? Я думаю 100%. Так куда двигаться в такой ситуации?
Попробую как рекомендует nemez сделать, только вот как можно на другой стороне принять мой пакет причем с анализом контрольной суммы и размер наверняка учитывается а айпи заголовке, если я его не формирую мне также не понятно... а он тем временем принимается без ошибок. |
Сообщ.
#23
,
|
|
|
Цитата Columbo @ nemez а я думал ip заголовок формируется автоматически... Так оно и есть, если не применяется опция IP_HDRINCL. А идеологически я согласен с ЫукпШ |
Сообщ.
#24
,
|
|
|
Oleg2004 я уже понял
|
Сообщ.
#25
,
|
|
|
nemez я не нашел где формируется заголовок айпи в коде по твоей ссылке..
main(int argc, char **argv) { d = WSAStartup (MAKEWORD(2,1),&ws); printf("WSAStartup Return Value=%d\n",d); s = WSASocket(AF_INET,SOCK_RAW, IPPROTO_ICMP ,NULL, 0,0); printf("Socket Return Value=%d\n",s); hp = gethostbyname(argv[1]); memcpy(&dest.sin_addr,hp->h_addr,hp->h_length); dest.sin_family = hp->h_addrtype; printf("hp=%x Ip Address=%s\n",hp,inet_ntoa(dest.sin_addr)); pIcmpHeader = (IcmpHeader *) malloc(sizeof(IcmpHeader)); pIcmpHeader->i_type = 8; pIcmpHeader->i_code = 0; pIcmpHeader->i_id = (USHORT)GetCurrentProcessId(); pIcmpHeader->i_cksum = 0; pIcmpHeader->i_seq = 326; memset(pIcmpHeader->data ,'A', 32); pIcmpHeader->timestamp = GetTickCount(); pIcmpHeader->i_cksum = checksum((USHORT *)pIcmpHeader,sizeof(IcmpHeader)); d = sendto(s,(char *)pIcmpHeader,sizeof(IcmpHeader),0,(struct sockaddr*)&dest,sizeof(dest)); printf("Sentto return value=%d\n",d); dummy = sizeof(dest); d = recvfrom(s ,databuf,1024,0,(struct sockaddr*)&dest,&dummy); printf("recvfrom return value=%d\n",d); pIpHeader = (struct IpHeader *)databuf; printf("len=%x TOS=%d Total length %d %d\n",pIpHeader->lenver,pIpHeader->tos,pIpHeader->totallen , htons(pIpHeader->totallen)); printf("ident=%d Frag=%d TTL=%d Protocol=%d\n",pIpHeader->ident, pIpHeader->fragandflags,pIpHeader->ttl,pIpHeader->proto); printf("CheckSum=%d %d\n",pIpHeader->checksum , checksum((USHORT *)databuf,20+32+12)); printf("Source IP=%s Dest Ip=%s\n",inet_ntoa(pIpHeader->sourceIP),inet_ntoa(pIpHeader->destIP)); printf("dest=%s\n",inet_ntoa(dest.sin_addr)); int size = pIpHeader->lenver & 0x0f; size = size * 4; size = size - 20; printf("Size of IP headers %d\n",size); if ( size > 0) { struct ipopt *pipopt; pipopt = (struct ipopt *)(databuf + 20); printf("code=%d len=%d ptr=%d\n",pipopt->code,pipopt->len,pipopt->ptr); int noofstr; noofstr = (pipopt->ptr/4) - 1; printf("No of addr's=%d\n",noofstr); for ( i = 0 ; i < noofstr ; i++) { struct in_addr a; a.S_un.S_addr = pipopt->addr[i]; printf("%s\n",inet_ntoa(a)); } } } структура заголовка заполняется уже после принятия пакета, это другая история, а перед отправкой - нет. |
Сообщ.
#26
,
|
|
|
Цитата Columbo @ ЫукпШ Вот я убрал из прогаммы обновление Label->Caption, точнее даже не убрал а просто убрал пару строк оттуда и прекрасно обменивался пакетами без ошибок. Размеры программы изменились, возможно изменилось расположение кодов относительно данных. По прежнему что-то портится, только в другом месте и в этой точке приложения не проявляется. |
Сообщ.
#27
,
|
|
|
Цитата Columbo @ nemez я не нашел где формируется заголовок айпи в коде по твоей ссылке.. ipopt.code = 7; ipopt.ptr = 4; ipopt.len = 39; setsockopt (s, IPPROTO_IP, IP_OPTIONS,(char *)&ipopt, sizeof(ipopt)); ..... вот тебе пдфочка http://www.beknowledge.com/wp-content/uplo...2010/09/892.pdf см. поиском функцию (<Ctrl-f>) void DecodeIPOptions(char *buf, int bytes) Через структуру (struct ipopt в том исходнике что ты смотрел) через setsockopt передаются параметры заголовка ip. зы. Собери консольный пинг с примера рабочий, это тебе облегчит задачу |
Сообщ.
#28
,
|
|
|
пошел собирать...
|
Сообщ.
#29
,
|
|
|
Предлагаю вместо
unsigned char d = StrToInt(EditDataOut->Text); unsigned int d = StrToInt(EditDataOut->Text); |
Сообщ.
#30
,
|
|
|
Цитата Columbo @ //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonClick(TObject *Sender) { tICMP ICMP1; unsigned char DataOut[512]; // unsigned char d = StrToInt(EditDataOut->Text); for (int i=0; i<100; i++) { DataOut[i] = 0x55; // DataOut[i] = d; } AnsiString Res = ICMP1.SendData("192.168.1.1", DataOut, 100); if (Res != "OK") { ShowMessage(Res); return; } } //----------------------------------------------------------------- Что за говнокод? Сплошной хардкодинг. Это неприемлемо в коммерческом коде, отсюда ошибки. |