[Top][All Lists]
[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r12699 - gnunet/src/transport,
gnunet <=