Практика
Для практической реализации, как всегда, можно использовать несколько подходов. Первый из них - использование низкоуровневых функций API (к примеру, встроенных в библиотеку ICMP.DLL). Второй - использование высокоуровневых компонентов (к примеру, Indy IdICMPClient).
И у первого, и у второго способа есть свои позитивные и негативные моменты. Так, при использовании функций API откомпилированный код будет иметь гораздо меньшие размеры, нежели при использовании высокоуровневых компонентов,- да и производительность его будет выше (например, при одновременном пинге одной подсети с использованием потоков).
С другой стороны, компоненты можно использовать, имея только отдаленное представление о работе с протоколом ICMP, а также об использовании Windows API. Но, в то же время, компоненты порождают неоправданно большой исполняемый код, да и производительность в этом случае ниже. К счастью, сегодня разработчиками процессоров и памяти почти стерта грань между производительностью кода, написанного с использованием Windows API, и кода, написанного с использованием средств более высокого уровня абстракции (в нашем случае - компонентов Delphi).
На всякий случай приведем примеры пинга, написанного как с использованием WinAPI так и с использованием компонентов Indy.