- fprintf (stderr, "Failed to find Winsock 2.1 or better.\n");
- return 2;
- }
- if (INVALID_SOCKET == (icmpsock = make_icmp_socket()))
- {
- return 3;
- }
- if (INVALID_SOCKET == (make_raw_socket()))
- {
- closesocket (icmpsock);
- return 3;
- }
- if (INVALID_SOCKET == (udpsock = make_udp_socket(&external)))
- {
- closesocket (icmpsock);
- closesocket (rawsock);
- return 3;
- }
- while (1)
- {
- FD_ZERO (&rs);
- FD_SET (icmpsock, &rs);
- tv.tv_sec = 0;
- tv.tv_usec = ICMP_SEND_FREQUENCY_MS * 1000;
- if (-1 == select (icmpsock + 1, &rs, NULL, NULL, &tv))
- {
- if (errno == EINTR)
- continue;
- fprintf (stderr,
- "select failed: %s\n",
- strerror (errno));
- break;
- }
- if (FD_ISSET (icmpsock, &rs))
- process_icmp_response ();
- if (0 == (++alt % 2))
- send_icmp_echo (&external);
- else
- send_udp ();