Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
9 / 9 / 0
Регистрация: 03.01.2010
Сообщений: 28
1

Пинг на дельфи 7

29.10.2010, 15:37. Просмотров 4597. Ответов 2
Метки нет (Все метки)


Возникла необходимость создания утилитки для пингования. Погуглил, нашел несколько решений. Единственным подходящим для моей ситуации оказалось решение использовать библиотеку icmp.dll Написал код. Вроде бы все правильно. Но вот при вызове функции IcmpSendEcho возникает ошибка: GetLastError возвращает код 122. ERROR_INSUFFICIENT_BUFFER 122 (0x7A). The data area passed to a system call is too small.
Что-то не так с буфером, а что никак понять не могу. Если кто заметил ошибку подскажите.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Type
  AmtOptionInformation=^AmtPOptionInformation;
  AmtPOptionInformation=record
    Ttl:byte; // Time To Live
    Tos:byte; // Type Of Service
    Flags:byte; // IP header flags
    OptionsSize:byte; // Size in bytes of options data
    OptionsData:pointer; // Pointer to options data
    end;
 
Type
  AmtIcmpReply=record
    Address: TipAddr;
    Status:integer;
    RoundTripTime:integer;
    DataSize:word;
    Reserved:word;
    DataPtr:pointer;
    Options:AmtOptionInformation;
    Data:array[0..255] of Char;
    end;
 
function PingStatusToStr (StatusCode:integer):string;
function IcmpCreateFile:Thandle; StdCall;
function IcmpCloseHandle (H:Thandle):Bool; StdCall;
function IcmpSendEcho(
                     IcmpHandle : THandle;
                     DestAddress : u_long;
                     RequestData : Pointer;
                     RequestSize : Word;
                     RequestOptns : AmtOptionInformation;
                     ReplyBuffer : Pointer;
                     ReplySize : DWORD;
                     Timeout : DWORD
                     ) : DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';
function inet_addr(IPAddress:PChar):TipAddr;StdCall; external 'WSock32.Dll' name 'inet_addr';
 
 
procedure Ping;
var
  ICMPHandle:THandle;
  IPAddress:TIpAddr;
  Error:DWord;
  Res:integer;
  pingBuffer:array[0..31] of Char;
  ping_reply_buffer:^AmtIcmpReply;//результат пинга - буфер с ответами
begin
//проверяем адрес
IPAddress:=inet_addr(PChar(Address));
if (IPAddress=INADDR_NONE) then
  begin
  FErrorCode.Err:=GetLastError;
  FErrorCode.Reserved:='INADDR_NONE '+Address+'\';
  DoError;
  EndPinging;
  Exit;
  end;
ICMPHandle:=ICMPCreateFile();
//Провряем handle
if (ICMPHandle=INVALID_HANDLE_VALUE) then
  begin
  FErrorCode.Err:=GetLastError;
  FErrorCode.Reserved:='INVALID_HANDLE_VALUE';
  DoError;
  EndPinging;
  Exit;
  end;
//отослать пинг пакет
 
GetMem(ping_reply_buffer,sizeof(AmtIcmpReply)+sizeof(pingBuffer));
ping_reply_buffer.DataPtr:=@pingBuffer;
ping_reply_buffer.DataSize:=sizeof(pingBuffer);
 
res:=IcmpSendEcho(ICMPHandle,IPAddress,@pingBuffer,Length(pingBuffer),
             nil,@ping_reply_buffer,SizeOf(ping_reply_buffer),PingTimeout);
error:=GetLastError;
  //вот здесь error становится 122
if (error<>0) then
  begin
  FErrorCode.Err:=error;
  DoError;
  end else begin
  //Заполнить PingReply
  DoReply;
  end;
IcmpCloseHandle(ICMPHandle);
FreeMem(ping_reply_buffer);
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2010, 15:37
Ответы с готовыми решениями:

Импорт кода из Дельфи-файла без установленного Дельфи
Есть файлы проекта делфи, как без установленного делфи просмотреть код программы? Или может кто то...

С ПК1 к ПК2 идет пинг. А с ПК2 к ПК1 не идет пинг. Как сделать что бы с ПК2 шел пинг к ПК1 ?
В работе есть два сети, один старый, другой новый, так говорили. С новой сети можно пинговать...

Скажите пожалуйста почему у дельфи 6,7 нет совместимости с Windows 7 и какая версия дельфи совместима с windows 7
Скажите пожалуйста почему у дельфи 6,7 нет совместимости с Windows 7. и какая версия дельфи...

Пинг
Честно, ассемблером только начал заниматься. Кто может, киньте код программы, которая будет...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
2
Формучанин
362 / 293 / 41
Регистрация: 02.11.2010
Сообщений: 1,234
02.11.2010, 10:21 2
Delphi
1
2
res:=IcmpSendEcho(ICMPHandle,IPAddress,@pingBuffer,Length(pingBuffer),
             nil,ping_reply_buffer,sizeof(AmtIcmpReply)+sizeof(pingBuffer),PingTimeout)
первое что в глаза бросилось:
ты передаёшь функции указатель на указатель? а следующий аргумент размер указателя?(тоесть 4)
выше исправленный вариант, попробуй. Корректность не проверял
1
9 / 9 / 0
Регистрация: 03.01.2010
Сообщений: 28
02.11.2010, 20:57  [ТС] 3
Спасибо! Действительно ошибка была этом. Собственная невнимательность снова подвела.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2010, 20:57

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Ip пинг
Здравствуйте кто подскажет как можно делать проверку IP адреса. Например есть адрес и нужно...

Ограничение на пинг
Здравствуйте, софтина пингует несколько адресов по таймеру, но при таймауте на одном зависает ,...

Wi-Fi странный пинг
Здравстуйте. грубо говоря, мы имеем 2 компьютера на расстоянии 200-300 метров. к обоим...

Пинг-понг
Приветствую. Как сделать так, чтобы шарик нормально рисовался и красная платформа при движении в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.