diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-09-29 15:27:08 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-09-29 20:00:36 -0700 |
| commit | 869d0eeb20657cd6d2e87d8c4836b086c6be448d (patch) | |
| tree | 4731bf410cf36fb3442861575807dbb83400a3b3 /src/platform/windows/win_sockaddr.c | |
| parent | 82d17f6365a95a500c32ae3a4ad40ff6fb609f3e (diff) | |
| download | nng-869d0eeb20657cd6d2e87d8c4836b086c6be448d.tar.gz nng-869d0eeb20657cd6d2e87d8c4836b086c6be448d.tar.bz2 nng-869d0eeb20657cd6d2e87d8c4836b086c6be448d.zip | |
Windows UDP support.
This implements the basic UDP functionality for Windows (required
for ZeroTier for example). We have also introduced a UDP test suite
to validate that this actually works. While here a few Windows
compilation warnings / nits were fixed.
Diffstat (limited to 'src/platform/windows/win_sockaddr.c')
| -rw-r--r-- | src/platform/windows/win_sockaddr.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/platform/windows/win_sockaddr.c b/src/platform/windows/win_sockaddr.c new file mode 100644 index 00000000..0fa6dd51 --- /dev/null +++ b/src/platform/windows/win_sockaddr.c @@ -0,0 +1,67 @@ +// +// Copyright 2017 Garrett D'Amore <garrett@damore.org> +// Copyright 2017 Capitar IT Group BV <info@capitar.com> +// +// This software is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +#include "core/nng_impl.h" + +#ifdef NNG_PLATFORM_WINDOWS + +#include <string.h> + +int +nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa) +{ + SOCKADDR_IN * sin; + SOCKADDR_IN6 *sin6; + + switch (sa->s_un.s_family) { + case NNG_AF_INET: + sin = (void *) ss; + memset(sin, 0, sizeof(*sin)); + sin->sin_family = PF_INET; + sin->sin_port = sa->s_un.s_in.sa_port; + sin->sin_addr.s_addr = sa->s_un.s_in.sa_addr; + return (sizeof(*sin)); + + case NNG_AF_INET6: + sin6 = (void *) ss; + memset(sin6, 0, sizeof(*sin6)); + sin6->sin6_family = PF_INET6; + sin6->sin6_port = sa->s_un.s_in6.sa_port; + memcpy(sin6->sin6_addr.s6_addr, sa->s_un.s_in6.sa_addr, 16); + return (sizeof(*sin6)); + } + return (-1); +} + +int +nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss) +{ + SOCKADDR_IN * sin; + SOCKADDR_IN6 *sin6; + + switch (ss->ss_family) { + case PF_INET: + sin = (void *) ss; + sa->s_un.s_in.sa_family = NNG_AF_INET; + sa->s_un.s_in.sa_port = sin->sin_port; + sa->s_un.s_in.sa_addr = sin->sin_addr.s_addr; + return (0); + + case PF_INET6: + sin6 = (void *) ss; + sa->s_un.s_in6.sa_family = NNG_AF_INET6; + sa->s_un.s_in6.sa_port = sin6->sin6_port; + memcpy(sa->s_un.s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16); + return (0); + } + return (-1); +} + +#endif // NNG_PLATFORM_WINDOWS
\ No newline at end of file |
