Code này tham khảo ở 1 trang web, cũng ko nhớ là trang nào nữa:

Chương trình sẽ ping nhiều IP bất kì cùng 1 lúc:

Hàm API chính:
-IcmpSendEcho2: Hàm này giống hàm IcmpSendEcho nhưng khác ở chỗ có thể dùng cơ chế Event hoặc gọi thread khi có gói tin reply nên hàm có thể trả về ngay lập tức. Khi có gói tin trả về hoặc hết thời gian ttl (time to live) thì event sẽ được set, ta dùng WaitForMultipleObjects để chờ cho đến khi tất cả các event được set.
-IcmpParseReplies: Hàm này dùng để phân tích vùng nhớ và đếm số lường các gói tin reply nhận được (hàm này hình như trong file .lib bị hỏng nên gọi trực tiếp từ dll = loadlibrary, getprocaddress).

Code:
#include "stdafx.h"
#if defined(_MSC_VER)
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "Ws2_32.lib")
#endif

/*
 * Simple structure of arrays to create Targets collection.
 */
#define MAX_TARGETS 300
struct
{
        struct in_addr IPAddresses[MAX_TARGETS];     //địa chỉ IP của các target
        BYTE          Buffers    [MAX_TARGETS][sizeof(ICMP_ECHO_REPLY) + 32];  //buffer để nhận gói tin reply
        HANDLE        Events    [MAX_TARGETS];     //Event handle của các target
        UINT          cTargets;          //Số lượng target
} Targets;

/*
 * Add an IP address to the Targets collection.
 */
BOOL new_Target(ULONG addr)
{
        if (Targets.cTargets < MAX_TARGETS)
        {
                Targets.Events[Targets.cTargets] = CreateEvent(NULL, FALSE, FALSE, NULL);        //Tạo event cho mỗi target.
                Targets.IPAddresses[Targets.cTargets].S_un.S_addr = addr;
                Targets.cTargets++;

                return TRUE;
        }

        return FALSE;
}

/*
 * Ko gọi được IcmpParseReplies trực tiếp nên dùng con trỏ hàm.
 */
 typedef (WINAPI * pIPR)(LPVOID, DWORD);
 static pIPR dl_IcmpParseReplies;

int main(void)
{
	size_t i;
	DWORD  ret;
	HANDLE hIcmp;
	BYTE  PingData[16];   //Phần dữ liệu để gửi trong gói ICMP, là cái gì cũng được.

	HMODULE hICMP = LoadLibrary(TEXT("ICMP.dll"));
	dl_IcmpParseReplies = (pIPR) GetProcAddress(hICMP, "IcmpParseReplies");

	/* Add IP Addresses to check. */
	//Ping các IP trong khoảng 222.252.100.x
	for (c = 0; c <= 255; c++)
		new_Target (MAKELONG (MAKEWORD(222,252), MAKEWORD(100,c)));

        hIcmp = IcmpCreateFile();      //Tạo ICMP handle

        /*Gửi gói ICMP đến tất cả các target */
        for (i = 0; i < Targets.cTargets; i++)
        {
                IcmpSendEcho2 (hIcmp, 
		Targets.Events[i],  //Event đã được tạo của từng target
		NULL, 0,      //Ko dùng thread
		Targets.IPAddresses[i].S_un.S_addr, PingData, sizeof(PingData), NULL, 
		Targets.Buffers[i], sizeof(Targets.Buffers[i]), //Vùng nhớ để chứa gói reply
		5000); //ttl là 5 s
        }


        /* Chờ cho đến khi nhận được gói reply hay time out */
	//Hàm này chỉ chờ tối đa cho 64 đối tượng 1 lúc
	WaitForMultipleObjects(64, &Targets.Events[0], TRUE, 5000);
	WaitForMultipleObjects(64, &Targets.Events[64], TRUE, 5000);
	WaitForMultipleObjects(64, &Targets.Events[128], TRUE, 5000);
	WaitForMultipleObjects(64, &Targets.Events[192], TRUE, 5000);

	/* Kiểm tra kết quả */
	for (i = 0; i < Targets.cTargets; i++)
	{
		ret = dl_IcmpParseReplies(Targets.Buffers[i], sizeof(Targets.Buffers[i]));
		if (ret)
		{
			printf("%s\n", inet_ntoa(Targets.IPAddresses[i]));
			c++;
		};
	};
	printf ("%d host up", c);
	IcmpCloseHandle(hIcmp);

	getchar ();
	return 0;
}

Đây là console app, các file include trong stdafx.h:
#include <winsock2.h>
#include <windows.h>
#include <Ipexport.h>
#include <icmpapi.h>
#include <stdio.h>