summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@zerotier.com>2014-03-28 12:26:33 -0700
committerAdam Ierymenko <adam.ierymenko@zerotier.com>2014-03-28 12:26:33 -0700
commite8b613e625d18a03d14073e4634cdfb64e120d38 (patch)
tree5c0192b890e59a8c26ac145984507130b7dfb76d /node
parent9c68a343f600f92019561662d41a5261728bc698 (diff)
downloadinfinitytier-e8b613e625d18a03d14073e4634cdfb64e120d38.tar.gz
infinitytier-e8b613e625d18a03d14073e4634cdfb64e120d38.zip
TCP connections work on Windows now.
Diffstat (limited to 'node')
-rw-r--r--node/SocketManager.cpp18
-rw-r--r--node/TcpSocket.cpp11
2 files changed, 22 insertions, 7 deletions
diff --git a/node/SocketManager.cpp b/node/SocketManager.cpp
index 8bbf94d2..41facdc0 100644
--- a/node/SocketManager.cpp
+++ b/node/SocketManager.cpp
@@ -364,10 +364,6 @@ bool SocketManager::send(const InetAddress &to,bool tcp,const void *msg,unsigned
SOCKET s = ::socket(to.isV4() ? AF_INET : AF_INET6,SOCK_STREAM,0);
if (s == INVALID_SOCKET)
return false;
- if (s >= FD_SETSIZE) {
- ::closesocket(s);
- return false;
- }
{ u_long iMode=1; ioctlsocket(s,FIONBIO,&iMode); }
#ifdef ZT_TCP_NODELAY
{ BOOL f = TRUE; setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char *)&f,sizeof(f)); }
@@ -387,8 +383,12 @@ bool SocketManager::send(const InetAddress &to,bool tcp,const void *msg,unsigned
#endif
bool connecting = false;
- if (connect(s,to.saddr(),to.saddrLen())) {
+ if (::connect(s,to.saddr(),to.saddrLen())) {
+#ifdef __WINDOWS__
+ if (WSAGetLastError() != WSAEWOULDBLOCK) {
+#else
if (errno != EINPROGRESS) {
+#endif
CLOSE_SOCKET(s);
return false;
} else connecting = true;
@@ -480,8 +480,8 @@ void SocketManager::poll(unsigned long timeout)
if (sockfd != INVALID_SOCKET) {
#else
if (sockfd > 0) {
-#endif
if (sockfd < FD_SETSIZE) {
+#endif
InetAddress fromia((const struct sockaddr *)&from);
Mutex::Lock _l2(_tcpSockets_m);
try {
@@ -505,9 +505,11 @@ void SocketManager::poll(unsigned long timeout)
} catch ( ... ) {
CLOSE_SOCKET(sockfd);
}
+#ifndef __WINDOWS__
} else {
CLOSE_SOCKET(sockfd);
}
+#endif
}
}
if ((_tcpV6ListenSocket != INVALID_SOCKET)&&(FD_ISSET(_tcpV6ListenSocket,&rfds))) {
@@ -518,8 +520,8 @@ void SocketManager::poll(unsigned long timeout)
if (sockfd != INVALID_SOCKET) {
#else
if (sockfd > 0) {
-#endif
if (sockfd < FD_SETSIZE) {
+#endif
InetAddress fromia((const struct sockaddr *)&from);
Mutex::Lock _l2(_tcpSockets_m);
try {
@@ -543,9 +545,11 @@ void SocketManager::poll(unsigned long timeout)
} catch ( ... ) {
CLOSE_SOCKET(sockfd);
}
+#ifndef __WINDOWS__
} else {
CLOSE_SOCKET(sockfd);
}
+#endif
}
}
diff --git a/node/TcpSocket.cpp b/node/TcpSocket.cpp
index 5d475c93..fd8e9a94 100644
--- a/node/TcpSocket.cpp
+++ b/node/TcpSocket.cpp
@@ -164,6 +164,16 @@ bool TcpSocket::notifyAvailableForWrite(const SharedPtr<Socket> &self,SocketMana
if (_outptr) {
int n = (int)::send(_sock,(const char *)_outbuf,_outptr,0);
+#ifdef __WINDOWS__
+ if (n == SOCKET_ERROR) {
+ switch(WSAGetLastError()) {
+ case WSAEINTR:
+ case WSAEWOULDBLOCK:
+ break;
+ default:
+ return false;
+ }
+#else
if (n <= 0) {
switch(errno) {
#ifdef EAGAIN
@@ -179,6 +189,7 @@ bool TcpSocket::notifyAvailableForWrite(const SharedPtr<Socket> &self,SocketMana
default:
return false;
}
+#endif
} else memmove(_outbuf,_outbuf + (unsigned int)n,_outptr -= (unsigned int)n);
}