summaryrefslogtreecommitdiff
path: root/node/UdpSocket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/UdpSocket.cpp')
-rw-r--r--node/UdpSocket.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/node/UdpSocket.cpp b/node/UdpSocket.cpp
index 2f59a03c..24c130ca 100644
--- a/node/UdpSocket.cpp
+++ b/node/UdpSocket.cpp
@@ -63,7 +63,11 @@ UdpSocket::UdpSocket(
_packetHandler(packetHandler),
_arg(arg),
_localPort(localPort),
+#ifdef __WINDOWS__
+ _sock(INVALID_SOCKET),
+#else
_sock(0),
+#endif
_v6(ipv6)
{
#ifdef __WINDOWS__
@@ -77,8 +81,13 @@ UdpSocket::UdpSocket(
if (ipv6) {
_sock = socket(AF_INET6,SOCK_DGRAM,0);
+#ifdef __WINDOWS__
+ if (_sock == INVALID_SOCKET)
+ throw std::runtime_error("unable to create IPv6 SOCK_DGRAM socket");
+#else
if (_sock <= 0)
throw std::runtime_error("unable to create IPv6 SOCK_DGRAM socket");
+#endif
#ifdef __WINDOWS__
yes = TRUE; setsockopt(_sock,IPPROTO_IPV6,IPV6_V6ONLY,(const char *)&yes,sizeof(yes));
@@ -115,8 +124,13 @@ UdpSocket::UdpSocket(
}
} else {
_sock = socket(AF_INET,SOCK_DGRAM,0);
+#ifdef __WINDOWS__
+ if (_sock == INVALID_SOCKET)
+ throw std::runtime_error("unable to create IPv4 SOCK_DGRAM socket");
+#else
if (_sock <= 0)
throw std::runtime_error("unable to create IPv4 SOCK_DGRAM socket");
+#endif
#ifdef __WINDOWS__
no = FALSE; setsockopt(_sock,SOL_SOCKET,SO_REUSEADDR,(const char *)&no,sizeof(no));
@@ -154,16 +168,19 @@ UdpSocket::UdpSocket(
UdpSocket::~UdpSocket()
{
int s = _sock;
- _sock = 0;
- if (s > 0) {
#ifdef __WINDOWS__
+ _sock = INVALID_SOCKET;
+ if (s != INVALID_SOCKET) {
::shutdown(s,SD_BOTH);
::closesocket(s);
+ }
#else
+ _sock = 0;
+ if (s > 0) {
::shutdown(s,SHUT_RDWR);
::close(s);
-#endif
}
+#endif
Thread::join(_thread);
}