Fix windows (#51)
* More fixes for Windows * fix tests for windows * qf for linux * clean up
This commit is contained in:
committed by
Benjamin Sergeant
parent
d561e1141e
commit
78198a0147
@ -189,29 +189,26 @@ namespace ix
|
||||
|
||||
int Socket::getErrno()
|
||||
{
|
||||
int err;
|
||||
|
||||
#ifdef _WIN32
|
||||
return WSAGetLastError();
|
||||
err = WSAGetLastError();
|
||||
#else
|
||||
return errno;
|
||||
err = errno;
|
||||
#endif
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
bool Socket::isWaitNeeded()
|
||||
{
|
||||
int err = getErrno();
|
||||
|
||||
if (err == EWOULDBLOCK || err == EAGAIN)
|
||||
if (err == EWOULDBLOCK || err == EAGAIN || err == EINPROGRESS)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,20 @@
|
||||
#ifdef _WIN32
|
||||
#include <BaseTsd.h>
|
||||
typedef SSIZE_T ssize_t;
|
||||
|
||||
#undef EWOULDBLOCK
|
||||
#undef EAGAIN
|
||||
#undef EINPROGRESS
|
||||
#undef EBADF
|
||||
#undef EINVAL
|
||||
|
||||
// map to WSA error codes
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EAGAIN WSATRY_AGAIN
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EBADF WSAEBADF
|
||||
#define EINVAL WSAEINVAL
|
||||
|
||||
#endif
|
||||
|
||||
#include "IXCancellationRequest.h"
|
||||
@ -75,14 +89,13 @@ namespace ix
|
||||
|
||||
static int getErrno();
|
||||
static bool isWaitNeeded();
|
||||
static void closeSocket(int fd);
|
||||
|
||||
// Used as special codes for pipe communication
|
||||
static const uint64_t kSendRequest;
|
||||
static const uint64_t kCloseRequest;
|
||||
|
||||
protected:
|
||||
void closeSocket(int fd);
|
||||
|
||||
std::atomic<int> _sockfd;
|
||||
std::mutex _socketMutex;
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "IXSocketConnect.h"
|
||||
#include "IXDNSLookup.h"
|
||||
#include "IXNetSystem.h"
|
||||
#include "IXSocket.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
@ -18,18 +19,6 @@
|
||||
# include <linux/tcp.h>
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
void closeSocket(int fd)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
closesocket(fd);
|
||||
#else
|
||||
::close(fd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
namespace ix
|
||||
{
|
||||
//
|
||||
@ -56,11 +45,12 @@ namespace ix
|
||||
// block us for too long
|
||||
SocketConnect::configure(fd);
|
||||
|
||||
if (::connect(fd, address->ai_addr, address->ai_addrlen) == -1
|
||||
&& errno != EINPROGRESS && errno != 0)
|
||||
int res = ::connect(fd, address->ai_addr, address->ai_addrlen);
|
||||
|
||||
if (res == -1 && !Socket::isWaitNeeded())
|
||||
{
|
||||
errMsg = strerror(errno);
|
||||
closeSocket(fd);
|
||||
errMsg = strerror(Socket::getErrno());
|
||||
Socket::closeSocket(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -68,15 +58,17 @@ namespace ix
|
||||
{
|
||||
if (isCancellationRequested && isCancellationRequested()) // Must handle timeout as well
|
||||
{
|
||||
closeSocket(fd);
|
||||
Socket::closeSocket(fd);
|
||||
errMsg = "Cancelled";
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Use select to check the status of the new connection
|
||||
// On Linux the timeout needs to be re-initialized everytime
|
||||
// http://man7.org/linux/man-pages/man2/select.2.html
|
||||
struct timeval timeout;
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 10 * 1000; // 10ms timeout
|
||||
|
||||
fd_set wfds;
|
||||
fd_set efds;
|
||||
|
||||
@ -85,11 +77,13 @@ namespace ix
|
||||
FD_ZERO(&efds);
|
||||
FD_SET(fd, &efds);
|
||||
|
||||
if (select(fd + 1, nullptr, &wfds, &efds, &timeout) < 0 &&
|
||||
(errno == EBADF || errno == EINVAL))
|
||||
// Use select to check the status of the new connection
|
||||
res = select(fd + 1, nullptr, &wfds, &efds, &timeout);
|
||||
|
||||
if (res < 0 && (Socket::getErrno() == EBADF || Socket::getErrno() == EINVAL))
|
||||
{
|
||||
closeSocket(fd);
|
||||
errMsg = std::string("Connect error, select error: ") + strerror(errno);
|
||||
Socket::closeSocket(fd);
|
||||
errMsg = std::string("Connect error, select error: ") + strerror(Socket::getErrno());
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -110,7 +104,7 @@ namespace ix
|
||||
optval != 0)
|
||||
#endif
|
||||
{
|
||||
closeSocket(fd);
|
||||
Socket::closeSocket(fd);
|
||||
errMsg = strerror(optval);
|
||||
return -1;
|
||||
}
|
||||
@ -121,7 +115,7 @@ namespace ix
|
||||
}
|
||||
}
|
||||
|
||||
closeSocket(fd);
|
||||
Socket::closeSocket(fd);
|
||||
errMsg = "connect timed out after 60 seconds";
|
||||
return -1;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ namespace ix
|
||||
<< "at address " << _host << ":" << _port
|
||||
<< " : " << strerror(Socket::getErrno());
|
||||
|
||||
::close(_serverFd);
|
||||
Socket::closeSocket(_serverFd);
|
||||
return std::make_pair(false, ss.str());
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ namespace ix
|
||||
<< "at address " << _host << ":" << _port
|
||||
<< " : " << strerror(Socket::getErrno());
|
||||
|
||||
::close(_serverFd);
|
||||
Socket::closeSocket(_serverFd);
|
||||
return std::make_pair(false, ss.str());
|
||||
}
|
||||
|
||||
@ -115,7 +115,7 @@ namespace ix
|
||||
<< "at address " << _host << ":" << _port
|
||||
<< " : " << strerror(Socket::getErrno());
|
||||
|
||||
::close(_serverFd);
|
||||
Socket::closeSocket(_serverFd);
|
||||
return std::make_pair(false, ss.str());
|
||||
}
|
||||
|
||||
@ -159,7 +159,7 @@ namespace ix
|
||||
_stop = false;
|
||||
|
||||
_conditionVariable.notify_one();
|
||||
::close(_serverFd);
|
||||
Socket::closeSocket(_serverFd);
|
||||
}
|
||||
|
||||
void SocketServer::setConnectionStateFactory(
|
||||
@ -242,7 +242,7 @@ namespace ix
|
||||
// Accept a connection.
|
||||
struct sockaddr_in client; // client address information
|
||||
int clientFd; // socket connected to client
|
||||
socklen_t addressLen = sizeof(socklen_t);
|
||||
socklen_t addressLen = sizeof(client);
|
||||
memset(&client, 0, sizeof(client));
|
||||
|
||||
if ((clientFd = accept(_serverFd, (struct sockaddr *)&client, &addressLen)) < 0)
|
||||
@ -250,9 +250,10 @@ namespace ix
|
||||
if (!Socket::isWaitNeeded())
|
||||
{
|
||||
// FIXME: that error should be propagated
|
||||
int err = Socket::getErrno();
|
||||
std::stringstream ss;
|
||||
ss << "SocketServer::run() error accepting connection: "
|
||||
<< strerror(Socket::getErrno());
|
||||
<< err << ", " << strerror(err);
|
||||
logError(ss.str());
|
||||
}
|
||||
continue;
|
||||
@ -266,7 +267,7 @@ namespace ix
|
||||
<< "Not accepting connection";
|
||||
logError(ss.str());
|
||||
|
||||
::close(clientFd);
|
||||
Socket::closeSocket(clientFd);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
Reference in New Issue
Block a user