Виндовс подржава протокол порука о интернетској контроли (ИЦМП) како би утврдио да ли је одређени домаћин доступан или не. ИЦМП је протокол мрежног слоја који пружа контролу протока, поруке о грешци, усмеравање и друге податке између Интернет хостова. ИЦМП примарно користе програмери апликација за мрежни пинг.
Шта је пинг?
Пинг је процес слања ехо поруке на ИП адресу и читања одговора како би се потврдила веза између ТЦП / ИП хостови. Ако пишете нову апликацију, биће вам боље да користите Винсоцк 2 подршку за сирове утичнице, имплементирану у Инди, на пример.
Међутим, имајте на уму да су за имплементације Виндовс НТ и Виндовс 2000 Рав Соцкетс подложне безбедносним проверама и да су доступне само члановима администраторске групе. Ицмп.длл пружа функционалност која омогућава програмерима да пишу Интернет пинг апликације на Виндовс системима без подршке Винсоцк 2.
Имајте на уму да се функција Винсоцк 1.1 ВСАСтартуп мора позвати пре употребе функција изложених ИЦМП.ДЛЛ. Ако то не учините, први позив на ИцмпСендЕцхо неће успети са грешком 10091 (ВСАСИСНОТРЕАДИ).
Испод можете пронаћи изворни код Пинг јединице. Ево два примера употребе.
Пример 1: Исјечак кода
користи Пинг; ...
цонст АДП_ИП = '208.185.127.40'; (* http://delphi.about.com *)
запоцети Пинг. Пинг (АДП_ИП) онда СховМессаге ('О доступном Делпхи програмирању!');
крај;
Пример 2: Делпхи програм за режим конзоле
Наш следећи пример је режим конзоле Делпхи програм која користи Пинг јединицу:. Ево извора Пинг јединице:
јединица Пинг;
интерфејси
Виндовс, СисУтилс, класе;
тип
ТСунБ = упакована плоча
с_б1, с_б2, с_б3, с_б4: бајт;
крај;
ТСунВ = упакована плоча
с_в1, с_в2: реч;
крај;
ПИПАддр = ^ ТИПАддр;
ТИПАддр = запис
случај цијели број од
0: (С_ун_б: ТСунБ); 1: (С_ун_в: ТСунВ); 2: (С_аддр: дуга реч);
крај; ИПАддр = ТИПАддр;
функција ИцмпЦреатеФиле: ТХандле; стдцалл; екстерни 'ицмп.длл';
функција ИцмпЦлосеХандле (ицмпХандле: ТХандле): боолеан;
стдцалл; екстерни 'ицмп.длл'
функција ИцмпСендЕцхо
(ИцмпХандле: ТХандле; Адреса одредишта: ИПАддр;
РекуестДата: Поинтер; РекуестСизе: Смаллинт;
РекуестОптионс: поинтер;
РеплиБуффер: Поинтер;
РеплиСизе: ДВОРД;
Истек времена: ДВОРД): ДВОРД; стдцалл; екстерни 'ицмп.длл';
функција Пинг (ИнетАддресс: низ): боолеан;
имплементације
ВинСоцк;
функција Дохвати (вар Улаз: низ;
цонст АДелим: низ = ' ';
цонст АДелете: Боолеан = тачно)
: низ;
вар
иПос: Интегер;
започети
ако АДелим = # 0 онда почните
// АнсиПос не ради са # 0
иПос: = Пос (АДелим, АИнпут);
крај другог почети
иПос: = Пос (АДелим, АИнпут);
крај;
ако иПос = 0 онда почните
Резултат: = АИнпут;
ако АДелете онда почните
АИнпут: = '';
крај;
крај другог почети
резултат: = Копирај (АИнпут, 1, иПос - 1);
ако АДелете онда почните
Избриши (АИнпут, 1, иПос + дужина (АДелим) - 1);
крај;
крај;
крај;
процедура ТранслатеСтрингТоТИнАддр (АИП: низ; вар АИнАддр);
вар
пх: ПХостЕнт; пац: ПЦхар; ГИнитДата: ТВСАДата;
започети
ВСАСтартуп ($ 101, ГИнитДата);
покушати
пхе: = ГетХостБиНаме (ПЦхар (АИП));
ако Додељено (фе) тхенбегин
пац: = пхе ^ .х_аддр_лист ^;
ако Додељено (пац) онда
започети
са ТИПАддр (АИнАддр) .С_ун_б почињу
с_б1: = бајт (пац [0]); с_б2: = бајт (пац [1]); с_б3: = бајт (пац [2]); с_б4: = бајт (пац [3]);
крај;
крај
друго
започети
подићи Изузетак. Креирај ('Грешка у добијању ИП-а од ХостНаме');
крај;
крај
друго
започети
подићи Изузетак. Креирај ('Грешка у добијању ХостНаме');
крај;
осим
ФиллЦхар (АИнАддр, СизеОф (АИнАддр), # 0);
крај; ВСАЦлеануп;
крај;
функција Пинг (ИнетАддресс: низ): боолеан;
вар
Ручка: ТХандле;
ИнАддр: ИПАддр;
ДВ: ДВОРД;
реп: низ[1..128] од бајт;
започети
резултат: = лажно; Ручка: = ИцмпЦреатеФиле;
ако Ручка = ИНВАЛИД_ХАНДЛЕ_ВАЛУЕ онда
Излаз;
ТранслатеСтрингТоТИнАддр (ИнетАддресс, ИнАддр);
ДВ: = ИцмпСендЕцхо (Ручка, ИнАддр, нула, 0, нула, @реп, 128, 0) Резултат: = (ДВ 0); ИцмпЦлосеХандле (Хандле);
крај;
крај.