gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12699 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r12699 - gnunet/src/transport
Date: Sat, 21 Aug 2010 18:57:45 +0200

Author: grothoff
Date: 2010-08-21 18:57:45 +0200 (Sat, 21 Aug 2010)
New Revision: 12699

Modified:
   gnunet/src/transport/gnunet-nat-server-windows.c
Log:
udp for w32

Modified: gnunet/src/transport/gnunet-nat-server-windows.c
===================================================================
--- gnunet/src/transport/gnunet-nat-server-windows.c    2010-08-21 16:54:47 UTC 
(rev 12698)
+++ gnunet/src/transport/gnunet-nat-server-windows.c    2010-08-21 16:57:45 UTC 
(rev 12699)
@@ -172,6 +172,11 @@
 static SOCKET rawsock;
 
 /**
+ * Socket we use to send our UDP requests.
+ */
+static SOCKET udpsock;
+
+/**
  * Target "dummy" address.
  */
 static struct in_addr dummy;
@@ -290,6 +295,40 @@
 
 
 /**
+ * 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.
  */
 static void
@@ -467,6 +506,44 @@
 }
 
 
+/**
+ * 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 @@
   fd_set rs;
   struct timeval tv;
   WSADATA wsaData;
+  unsigned int alt;
 
   if (argc != 2)
     {
@@ -509,6 +587,12 @@
       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 @@
        }
       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; 
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]