diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-08-21 16:57:45 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-08-21 16:57:45 +0000 |
commit | 6579a5ddbe00cbdfd0a3916e6dc18fd812e133be (patch) | |
tree | 55e18794fa484409b766c26933978f2c6bbba82f | |
parent | abbb17455c5b2a93df79e20158e152b6b7f3becd (diff) | |
download | gnunet-6579a5ddbe00cbdfd0a3916e6dc18fd812e133be.tar.gz gnunet-6579a5ddbe00cbdfd0a3916e6dc18fd812e133be.zip |
udp for w32
-rw-r--r-- | src/transport/gnunet-nat-server-windows.c | 90 |
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; | |||
172 | static SOCKET rawsock; | 172 | static SOCKET rawsock; |
173 | 173 | ||
174 | /** | 174 | /** |
175 | * Socket we use to send our UDP requests. | ||
176 | */ | ||
177 | static SOCKET udpsock; | ||
178 | |||
179 | /** | ||
175 | * Target "dummy" address. | 180 | * Target "dummy" address. |
176 | */ | 181 | */ |
177 | static struct in_addr dummy; | 182 | static 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 | */ | ||
302 | static void | ||
303 | send_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 | */ |
295 | static void | 334 | static 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 | */ | ||
514 | static SOCKET | ||
515 | make_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 | |||
470 | int | 547 | int |
471 | main (int argc, | 548 | main (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 | } |