*/
static SOCKET rawsock;
+/**
+ * Socket we use to send our UDP requests.
+ */
+static SOCKET udpsock;
+
/**
* Target "dummy" address.
*/
}
+/**
+ * Send a UDP message to the dummy IP.
+ *
+ * @param my_ip source address (our ip address)
+ */
+static void
+send_udp (const struct in_addr *my_ip)
+{
+ struct sockaddr_in dst;
+ ssize_t err;
+
+ memset (&dst, 0, sizeof (dst));
+ dst.sin_family = AF_INET;
+ dst.sin_addr = dummy;
+ dst.sin_port = htons (NAT_TRAV_PORT);
+ err = sendto(udpsock,
+ NULL, 0, 0,
+ (struct sockaddr*)&dst,
+ sizeof(dst));
+ if (err < 0)
+ {
+#if VERBOSE
+ fprintf(stderr,
+ "sendto failed: %s\n", strerror(errno));
+#endif
+ }
+ else if (err != 0)
+ {
+ fprintf(stderr,
+ "Error: partial send of ICMP message\n");
+ }
+}
+
+
/**
* We've received an ICMP response. Process it.
*/
}
+/**
+ * Create a UDP socket for writinging.
+ *
+ * @return -1 on error
+ */
+static SOCKET
+make_udp_socket ()
+{
+ SOCKET ret;
+ struct sockaddr_in addr;
+
+ ret = socket (AF_INET, SOCK_DGRAM, 0);
+ if (INVALID_SOCKET == ret)
+ {
+ fprintf (stderr,
+ "Error opening UDP socket: %s\n",
+ strerror (errno));
+ return INVALID_SOCKET;
+ }
+ memset (&addr, 0, sizeof (addr));
+ addr.sin_family = AF_INET;
+ /* addr.sin_addr zero == ours (hopefully...) */
+ addr.sin_port = htons (NAT_TRAV_PORT);
+
+ if (0 != bind (ret,
+ &addr,
+ sizeof(addr)))
+ {
+ fprintf (stderr,
+ "Error binding UDP socket to port %u: %s\n",
+ NAT_TRAV_PORT,
+ strerror (errno));
+ /* likely problematic, but not certain, try to continue */
+ }
+ return ret;
+}
+
+
int
main (int argc,
char *const *argv)
fd_set rs;
struct timeval tv;
WSADATA wsaData;
+ unsigned int alt;
if (argc != 2)
{
closesocket (icmpsock);
return 3;
}
+ if (INVALID_SOCKET == (udpsock = make_udp_socket()))
+ {
+ closesocket (icmpsock);
+ closesocket (rawsock);
+ return 3;
+ }
while (1)
{
FD_ZERO (&rs);
}
if (FD_ISSET (icmpsock, &rs))
process_icmp_response ();
- send_icmp_echo (&external);
+ if (0 == (++alt % 2))
+ send_icmp_echo (&external);
+ else
+ send_udp (&external);
}
/* select failed (internal error or OS out of resources) */
closesocket(icmpsock);
closesocket(rawsock);
+ closesocket(udpsock);
WSACleanup ();
return 4;
}