From: Christian Grothoff Date: Sat, 21 Aug 2010 16:57:45 +0000 (+0000) Subject: udp for w32 X-Git-Tag: initial-import-from-subversion-38251~20563 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=6579a5ddbe00cbdfd0a3916e6dc18fd812e133be;p=oweals%2Fgnunet.git udp for w32 --- 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 @@ -171,6 +171,11 @@ static SOCKET icmpsock; */ static SOCKET rawsock; +/** + * Socket we use to send our UDP requests. + */ +static SOCKET udpsock; + /** * Target "dummy" address. */ @@ -289,6 +294,40 @@ send_icmp_echo (const struct in_addr *my_ip) } +/** + * 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. */ @@ -467,6 +506,44 @@ make_raw_socket () } +/** + * 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 @@ main (int argc, fd_set rs; struct timeval tv; WSADATA wsaData; + unsigned int alt; if (argc != 2) { @@ -509,6 +587,12 @@ main (int argc, 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 @@ main (int argc, } 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; }