Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

Invalid pointer operation при пинге - в чем засада?   Найти похожие ветки 

 
fylhtq ©   (2004-07-06 14:52) [0]

Написал простенькую програмку пингующую заданный хост, а она непонятно по какому принципу вылитает с ошибкой:

[B]Project zzz.exe raised exception class EInvalidPointer with message "Invalid pointer operation"[/B]

причем определенные хосты пингует без проблем, а другие ни в какую.
ps Эта ошибка выскакивает по окончанию выполнения пингующей процедуры.

procedure TForm1.PingClick(Sender: TObject);
Var
    name:PAnsiChar;
    i:Integer;
begin
    If not(CheckHostName) Then Exit; // проверка правильности написания имени хоста

    hIP := IcmpCreateFile();
    GetMem( pIpe, sizeof(icmp_echo_reply) + sizeof(pingBuffer));
    pIpe.Data := @pingBuffer;
    pIpe.DataSize := sizeof(pingBuffer);
    wVersionRequested := MakeWord(1,1);
    error := WSAStartup(wVersionRequested,lwsaData);
    name:= PChar(Form1.HostName.text);
    pHostEn := gethostbyname(name);
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;
    // пингуем
    listbox1.items.Add("пингуем "+pHostEn^.h_name+" ["+inet_ntoa(destAddress)+
                       "] размер пакета "+IntToStr(PingSize)+" байт:");

   for i:=1 to PingCounts {глобальная integer} do
   begin
     Application.ProcessMessages;
     If StopFlag Then
     Begin
          StopFlag:=False;
          Break
     End;
     IcmpSendEcho(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
                  sizeof(icmp_echo_reply)+PingSize,5000);
     error := GetLastError();
     if (error <> 0) then listbox1.items.Add(IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(HiWord(pIpe^.Address)))+"   "+
                             "Узел недоступен")
     ELSE listbox1.items.Add(IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(HiWord(pIpe^.Address)))+"   "+
                             "Время отклика: "+floattostr(pIpe.RTTime)+" мс")
   end;
   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);
   end;


 
Digitman ©   (2004-07-06 15:34) [1]

отладчик тебе в руки - и вперед !


 
fylhtq ©   (2004-07-06 15:38) [2]

Большое спасибо, очень продуктивный ответ...


 
Anatoly Podgoretsky ©   (2004-07-06 15:47) [3]

Информации недостаточно, много неизвестных переменных, управляемых извне. Так что только отладчикю


 
fylhtq ©   (2004-07-06 16:25) [4]

Ну хоть копать то в какую сторону?


 
Reindeer Moss Eater ©   (2004-07-06 16:33) [5]

Копай в сторону поиска строки на которой вываливается ошибка


 
Digitman ©   (2004-07-06 16:55) [6]


> fylhtq ©   (06.07.04 15:38) [2]
> Большое спасибо, очень продуктивный ответ...


а ты как думал ?

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


> ошибка выскакивает по окончанию выполнения пингующей процедуры


и что есть, по-твоему, "окончание выполнения .. процедуры" ?
с т.з. маш.кода это есть выполнение инструкции RET N, а что тобой подразумевается - одному тебе известно, ты же не сподобился конкретизировать, мол, нате вам, сами догадывайтесь, что у меня в голове ..


 
fylhtq ©   (2004-07-06 16:55) [7]

IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
           sizeof(icmp_echo_reply)+PingSize,5000);

hIP:THandle;
destAddress : In_Addr;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
icmp_echo_reply = packed record
PingSize:Integer;

Хрен его знает, в другой аналогичной проге все работает... =:[
Сверил их чуть ли не побуквенно - все идентично, разве что имя переменной PingSize там другое...


 
Digitman ©   (2004-07-06 16:59) [8]


> IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
>            sizeof(icmp_echo_reply)+PingSize,5000);


эт чего ?
хочешь сказать, что на этой строчке происходит упомянутое исключение ? да не выдумывай небылиц !


 
fylhtq ©   (2004-07-06 17:00) [9]

В том смысле, что ежели ее закомментировать, то ошибка не выскакивает.

2Digitman
По моему, окончание процедуры - выполнение оператора "End;"


 
Digitman ©   (2004-07-06 17:09) [10]


> fylhtq ©   (06.07.04 17:00) [9]
> В том смысле, что ежели ее закомментировать, то ошибка не
> выскакивает.


разумеется ! потому что параметры передал кривые
код чужой надо не сдирать и менять бездумно, а анализировать его, прежде чем что-то менять ..


> По моему, окончание процедуры - выполнение оператора "End;"


ну а за ним-то, за этим оператором, что-то происходит, наверно !
ты трассировал код, который выполняется следом за возвратом из процедуры ?


 
fylhtq ©   (2004-07-06 17:16) [11]

Нет конструктива? Тогда какого фига!
Наверно я не от того, что у меня где-то засвербило вопрос задал, наверно я и сам пытался как-то разбираться? Вам так не кажется?
Не претендую на хорошее знание языка и специфики - потому и пытаюсь разобраться, а так как ошибка все-таки довольно специфическая - хотел по крайней мере узнать о направлении поиска глюка, так-как сам уже уперся.
А засирать и отправлять RTFM не надо, это я и сам умею.


 
Digitman ©   (2004-07-06 17:27) [12]

конструктив один - и тебе уже дан - пошаговая трассировка процедуры с проверкой всех задействованных параметров на соответствие ожидаемым


 
fylhtq ©   (2004-07-06 17:34) [13]

Такой конструктив я и сам уже осуществил, все параметры соответствуют ожидаемым.


 
Digitman ©   (2004-07-06 17:39) [14]


> fylhtq ©   (06.07.04 17:34) [13]


однако на сей момент так и непонятно, КАКОЙ КОНКРЕТНО оператор вызывает исключение ! и это ты называешь "конструктивом" - клещами вытягивать из тебя то, что ты давно уже должен был сделать - досконально выяснить это и сообщить сюда, коль ждешь помощи ?


 
fylhtq ©   (2004-07-06 18:59) [15]

Конец процедурыЖ
xor eax,eax
...
mov edx,$0000000f
call @LStrArrayClr
> call @FreeMem
>> call @Error
Это о чем нибудь говорит?


 
fylhtq ©   (2004-07-06 19:03) [16]

Мне просто интересно, как связать исполнение IcmpSendEcho с ошибкой очистки памяти?


 
Digitman ©   (2004-07-07 08:51) [17]


> Это о чем нибудь говорит?


говорит о том, что ты по прежнему не понимаешь вопроса

я не требовал от тебя трассировать маш.инструкции, все что нужно знать для поиска причины - какой оператор Паскаля вызывает исключение при исполнении ! Если это end, так и скажи !


> интересно, как связать исполнение IcmpSendEcho с ошибкой
> очистки памяти


связь простая - переменная PingSize в момент передачи ее значения в ф-цию содержит некорректное значение, что и приводит к печальным результатам

читаем справку из MSDN по параметрам ф-ции:

...
RequestData
[in] Buffer that contains the data to send in the request.

RequestSize
[in] Size of the request data buffer, in bytes. //а у тебя какая-то PingSize, непонятно какое значение имеющая !

ReplyBuffer
[out] Buffer to hold any replies to the request. Upon return, the buffer contains an array of ICMP_ECHO_REPLY structures followed by the options and data for the replies. The buffer should be large enough to hold at least one ICMP_ECHO_REPLY structure plus MAX(RequestSize, 8) bytes of data since an ICMP error message contains 8 bytes of data.

ReplySize
[out] Size of the reply buffer, in bytes. //и опять у тебя здесь фигурирует PingSize с непонятно каким значением !

чему равно у тебя значение PingSize на момент вызова ф-ции - это, разумеется, великий секрет


 
Anatoly Podgoretsky ©   (2004-07-07 09:00) [18]

Партизан


 
fylhtq ©   (2004-07-07 11:33) [19]


> Digitman ©   (07.07.04 08:51) [17]


> какой оператор Паскаля вызывает исключение при исполнении
> ! Если это end, так и скажи !



> ps Эта ошибка выскакивает по окончанию выполнения пингующей
> процедуры


> По моему, окончание процедуры - выполнение оператора "End;"


> IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
>            sizeof(icmp_echo_reply)+PingSize,5000);


> В том смысле, что ежели ее закомментировать, то ошибка не
> выскакивает.

Прошу прощения. но ЧЕМ вы читали мой вопрос?


 
fylhtq ©   (2004-07-07 11:53) [20]

Да кстати

> Такой конструктив я и сам уже осуществил, все параметры
> соответствуют ожидаемым.

В том числе и PingSize.(=64)

Если тут и есть завязки, то явно не на нее, так как

> определенные хосты пингует без проблем, а другие
> ни в какую.

При всех других прочих одинаковых. Т.Е. различия только в pHostEn^.h_name, destAddress.S_addr, etc...


 
Digitman ©   (2004-07-07 12:12) [21]


> В том числе и PingSize.(=64)


64 - от балды взято ? хочу, мол, 64 и все тут ?
в то время как размер массива pingBuffer у тебя равен 32 ?
или сейчас будешь утверждать, что "в другой аналогичной проге", в которой "все работает", при буфере pingBuffer равном 32 байта переменная PingSize (или как ее там) тоже равна 64 ?


 
fylhtq ©   (2004-07-07 12:27) [22]


> Digitman ©   (07.07.04 12:12) [21]

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

Однако с этим можно было разобраться и не разводя такую обширную дисскуссию с тыканьем мордой в грязь.

PS Однако в "другой аналогичной проге" таки все работает при любом значении PingSize, что и ввело в заблуждение... Видимо там все несколько иначе в конечном коде распологалось и не вредило. Темные силы электричества... =:]


 
Digitman ©   (2004-07-07 12:38) [23]


> несколько не верно представлял себе механизм действия -
> бывает


для этого существует оригинальная док-ция от Майкрософт, почитав которую можно получить верное представление


> дисскуссию с тыканьем мордой в грязь


никто тебя не "тыкал", не выдумывай

> Однако в "другой аналогичной проге" таки все работает при
> любом значении PingSize


не выдумывай
если PingSize <= sizeof(PingBuffer), то - да, работает, в противном случае - та же самая ситуация будет наблюдаться

разберись почему, оно полезно


 
fylhtq ©   (2004-07-09 14:05) [24]

Да нет, в том то и фишка, что работает, ясно, что это не правильно, но... Скорее всего связано это с хитрой компановкой блока данных в конечном коде, больше на ум ничего не приходит.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.043 c
14-1093155078
asdqwer
2004-08-22 10:11
2004.09.12
Пауза между появлением гудка в линии и набором номера


1-1093617452
Apachi
2004-08-27 18:37
2004.09.12
Lingvo


8-1088151204
wdst
2004-06-25 12:13
2004.09.12
Загрузка инфы из html файлов с винчестера


1-1093517056
Луарвик
2004-08-26 14:44
2004.09.12
Типизированые файлы:


14-1093280421
Piter
2004-08-23 21:00
2004.09.12
Шаровые молнии





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский