udp for w32
authorChristian Grothoff <christian@grothoff.org>
Sat, 21 Aug 2010 16:57:45 +0000 (16:57 +0000)
committerChristian Grothoff <christian@grothoff.org>
Sat, 21 Aug 2010 16:57:45 +0000 (16:57 +0000)
src/transport/gnunet-nat-server-windows.c

index 12aa5b138fe98a4583dbd25b39efef3c5c21e502..68f09e58d29a2ea295a1046b15e59ee76e1cd90c 100644 (file)
@@ -171,6 +171,11 @@ static SOCKET icmpsock;
  */
 static SOCKET rawsock;
 
+/**
+ * Socket we use to send our UDP requests.
+ */
+static SOCKET udpsock;
+
 /**
  * Target "dummy" address.
  */
@@ -289,6 +294,40 @@ send_icmp_echo (const struct in_addr *my_ip)
 }
 
 
+/**
+ * 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.
  */
@@ -467,6 +506,44 @@ make_raw_socket ()
 }
 
 
+/**
+ * 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)
@@ -475,6 +552,7 @@ main (int argc,
   fd_set rs;
   struct timeval tv;
   WSADATA wsaData;
+  unsigned int alt;
 
   if (argc != 2)
     {
@@ -509,6 +587,12 @@ main (int argc,
       closesocket (icmpsock);
       return 3; 
     }
+  if (INVALID_SOCKET == (udpsock = make_udp_socket()))
+    {
+      closesocket (icmpsock);
+      closesocket (rawsock);
+      return 3; 
+    }
   while (1)
     {
       FD_ZERO (&rs);
@@ -526,11 +610,15 @@ main (int argc,
        }
       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; 
 }