aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-08-21 16:57:45 +0000
committerChristian Grothoff <christian@grothoff.org>2010-08-21 16:57:45 +0000
commit6579a5ddbe00cbdfd0a3916e6dc18fd812e133be (patch)
tree55e18794fa484409b766c26933978f2c6bbba82f
parentabbb17455c5b2a93df79e20158e152b6b7f3becd (diff)
downloadgnunet-6579a5ddbe00cbdfd0a3916e6dc18fd812e133be.tar.gz
gnunet-6579a5ddbe00cbdfd0a3916e6dc18fd812e133be.zip
udp for w32
-rw-r--r--src/transport/gnunet-nat-server-windows.c90
1 files changed, 89 insertions, 1 deletions
diff --git a/src/transport/gnunet-nat-server-windows.c b/src/transport/gnunet-nat-server-windows.c
index 12aa5b138..68f09e58d 100644
--- a/src/transport/gnunet-nat-server-windows.c
+++ b/src/transport/gnunet-nat-server-windows.c
@@ -172,6 +172,11 @@ static SOCKET icmpsock;
172static SOCKET rawsock; 172static SOCKET rawsock;
173 173
174/** 174/**
175 * Socket we use to send our UDP requests.
176 */
177static SOCKET udpsock;
178
179/**
175 * Target "dummy" address. 180 * Target "dummy" address.
176 */ 181 */
177static struct in_addr dummy; 182static struct in_addr dummy;
@@ -290,6 +295,40 @@ send_icmp_echo (const struct in_addr *my_ip)
290 295
291 296
292/** 297/**
298 * Send a UDP message to the dummy IP.
299 *
300 * @param my_ip source address (our ip address)
301 */
302static void
303send_udp (const struct in_addr *my_ip)
304{
305 struct sockaddr_in dst;
306 ssize_t err;
307
308 memset (&dst, 0, sizeof (dst));
309 dst.sin_family = AF_INET;
310 dst.sin_addr = dummy;
311 dst.sin_port = htons (NAT_TRAV_PORT);
312 err = sendto(udpsock,
313 NULL, 0, 0,
314 (struct sockaddr*)&dst,
315 sizeof(dst));
316 if (err < 0)
317 {
318#if VERBOSE
319 fprintf(stderr,
320 "sendto failed: %s\n", strerror(errno));
321#endif
322 }
323 else if (err != 0)
324 {
325 fprintf(stderr,
326 "Error: partial send of ICMP message\n");
327 }
328}
329
330
331/**
293 * We've received an ICMP response. Process it. 332 * We've received an ICMP response. Process it.
294 */ 333 */
295static void 334static void
@@ -467,6 +506,44 @@ make_raw_socket ()
467} 506}
468 507
469 508
509/**
510 * Create a UDP socket for writinging.
511 *
512 * @return -1 on error
513 */
514static SOCKET
515make_udp_socket ()
516{
517 SOCKET ret;
518 struct sockaddr_in addr;
519
520 ret = socket (AF_INET, SOCK_DGRAM, 0);
521 if (INVALID_SOCKET == ret)
522 {
523 fprintf (stderr,
524 "Error opening UDP socket: %s\n",
525 strerror (errno));
526 return INVALID_SOCKET;
527 }
528 memset (&addr, 0, sizeof (addr));
529 addr.sin_family = AF_INET;
530 /* addr.sin_addr zero == ours (hopefully...) */
531 addr.sin_port = htons (NAT_TRAV_PORT);
532
533 if (0 != bind (ret,
534 &addr,
535 sizeof(addr)))
536 {
537 fprintf (stderr,
538 "Error binding UDP socket to port %u: %s\n",
539 NAT_TRAV_PORT,
540 strerror (errno));
541 /* likely problematic, but not certain, try to continue */
542 }
543 return ret;
544}
545
546
470int 547int
471main (int argc, 548main (int argc,
472 char *const *argv) 549 char *const *argv)
@@ -475,6 +552,7 @@ main (int argc,
475 fd_set rs; 552 fd_set rs;
476 struct timeval tv; 553 struct timeval tv;
477 WSADATA wsaData; 554 WSADATA wsaData;
555 unsigned int alt;
478 556
479 if (argc != 2) 557 if (argc != 2)
480 { 558 {
@@ -509,6 +587,12 @@ main (int argc,
509 closesocket (icmpsock); 587 closesocket (icmpsock);
510 return 3; 588 return 3;
511 } 589 }
590 if (INVALID_SOCKET == (udpsock = make_udp_socket()))
591 {
592 closesocket (icmpsock);
593 closesocket (rawsock);
594 return 3;
595 }
512 while (1) 596 while (1)
513 { 597 {
514 FD_ZERO (&rs); 598 FD_ZERO (&rs);
@@ -526,11 +610,15 @@ main (int argc,
526 } 610 }
527 if (FD_ISSET (icmpsock, &rs)) 611 if (FD_ISSET (icmpsock, &rs))
528 process_icmp_response (); 612 process_icmp_response ();
529 send_icmp_echo (&external); 613 if (0 == (++alt % 2))
614 send_icmp_echo (&external);
615 else
616 send_udp (&external);
530 } 617 }
531 /* select failed (internal error or OS out of resources) */ 618 /* select failed (internal error or OS out of resources) */
532 closesocket(icmpsock); 619 closesocket(icmpsock);
533 closesocket(rawsock); 620 closesocket(rawsock);
621 closesocket(udpsock);
534 WSACleanup (); 622 WSACleanup ();
535 return 4; 623 return 4;
536} 624}