Major issue in SimplePing

SimplePing is a small example to show how to use the Internet Control Message Protocol (ICMP) “ECHO” facility, measure round-trip-delays and packet loss across network paths.

The code is relatively simple and contains a main function int SimplePing(...) which pings a given remote host with a given number of packets and with a given timeout to wait for responses on each packet.

There is yet a major issue in that code.

If you look at the function which creates the ICMP packet CreateAndSendICMPPacket(...) you should see that the pid of the application is stored in the icmp_id field (identifier) of the ICMP packet:

This is used to know later that the ping originated from our application (here SimplePing). If you look at the function WaitAndPrintICMPs(...) which waits for the answer, you see:

When you first read that code, it seems to be right. There is yet a major issue.

getpid() is delared as pid_t getpid(void); (see unistd.h) and thus returns a 32 bits value. However the field icmp_id of the icmp header structure (see ip_icmp.h) is a n_short which can only contains 16 bits:

As a consequence, if the pid of the SimplePing application is bigger than 0xFFFF (65535), the pings will fail.