gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r12698 - gnunet/src/transport
Date: Sat, 21 Aug 2010 18:54:48 +0200

Author: grothoff
Date: 2010-08-21 18:54:47 +0200 (Sat, 21 Aug 2010)
New Revision: 12698

Modified:
   gnunet/src/transport/gnunet-nat-server.c
Log:
adding UDP server side

Modified: gnunet/src/transport/gnunet-nat-server.c
===================================================================
--- gnunet/src/transport/gnunet-nat-server.c    2010-08-21 07:30:50 UTC (rev 
12697)
+++ gnunet/src/transport/gnunet-nat-server.c    2010-08-21 16:54:47 UTC (rev 
12698)
@@ -74,6 +74,11 @@
 #define DUMMY_IP "192.0.2.86"
 
 /**
+ * Port for UDP
+ */ 
+#define NAT_TRAV_PORT 22225
+
+/**
  * How often do we send our ICMP messages to receive replies?
  */
 #define ICMP_SEND_FREQUENCY_MS 500
@@ -172,6 +177,11 @@
 static int rawsock;
 
 /**
+ * Socket we use to send our UDP requests.
+ */
+static int udpsock;
+
+/**
  * Target "dummy" address.
  */
 static struct in_addr dummy;
@@ -258,7 +268,7 @@
              "sendto failed: %s\n", strerror(errno));
 #endif
     }
-  else if (err != off) 
+  else if (err != sizeof (packet)) 
     {
       fprintf(stderr,
              "Error: partial send of ICMP message\n");
@@ -267,6 +277,44 @@
 
 
 /**
+ * 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;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  dst.sin_len = sizeof (struct sockaddr_in);
+#endif
+  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
@@ -444,6 +492,47 @@
 }
 
 
+/**
+ * Create a UDP socket for writinging.
+ *
+ * @return -1 on error
+ */
+static int
+make_udp_socket ()
+{
+  int ret;
+  struct sockaddr_in addr;
+
+  ret = socket (AF_INET, SOCK_DGRAM, 0);
+  if (-1 == ret)
+    {
+      fprintf (stderr,
+              "Error opening UDP socket: %s\n",
+              strerror (errno));
+      return -1;
+    }
+  memset (&addr, 0, sizeof (addr));
+  addr.sin_family = AF_INET;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  addr.sin_len = sizeof (struct sockaddr_in);
+#endif
+  /* 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)
@@ -452,6 +541,7 @@
   fd_set rs;
   struct timeval tv;
   uid_t uid;
+  unsigned int alt;
 
   if (argc != 2)
     {
@@ -489,6 +579,13 @@
               strerror (errno));    
       /* not critical, continue anyway */
     }
+  if (-1 == (udpsock = make_udp_socket()))
+    {
+      close (icmpsock);
+      close (rawsock);
+      return 3; 
+    }
+  alt = 0;
   while (1)
     {
       FD_ZERO (&rs);
@@ -506,11 +603,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) */
   close (icmpsock);
   close (rawsock);
+  close (udpsock);
   return 4;
 }
 




reply via email to

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