Removing old native socket stuff which is now unused (replaced by asio calls).

This commit is contained in:
lotodore
2009-06-16 22:00:07 +00:00
parent d45e41c963
commit 31dadd6fa2
19 changed files with 38 additions and 598 deletions
-7
View File
@@ -63,7 +63,6 @@ HEADERS += \
src/engine/playerinterface.h \ src/engine/playerinterface.h \
src/engine/berointerface.h \ src/engine/berointerface.h \
src/gui/guiinterface.h \ src/gui/guiinterface.h \
src/net/connectdata.h \
src/net/clientcallback.h \ src/net/clientcallback.h \
src/net/clientcontext.h \ src/net/clientcontext.h \
src/net/clientexception.h \ src/net/clientexception.h \
@@ -162,7 +161,6 @@ SOURCES += \
src/engine/network_engine/clienthand.cpp \ src/engine/network_engine/clienthand.cpp \
src/engine/network_engine/clientplayer.cpp \ src/engine/network_engine/clientplayer.cpp \
src/engine/network_engine/clientbero.cpp \ src/engine/network_engine/clientbero.cpp \
src/net/common/connectdata.cpp \
src/net/common/clientcallback.cpp \ src/net/common/clientcallback.cpp \
src/net/common/clientcontext.cpp \ src/net/common/clientcontext.cpp \
src/net/common/clientstate.cpp \ src/net/common/clientstate.cpp \
@@ -182,7 +180,6 @@ SOURCES += \
src/net/common/sessiondatacallback.cpp \ src/net/common/sessiondatacallback.cpp \
src/net/common/sessionmanager.cpp \ src/net/common/sessionmanager.cpp \
src/net/common/socket_startup_cmn.cpp \ src/net/common/socket_startup_cmn.cpp \
src/net/common/socket_helper_cmn.cpp \
src/net/common/clientexception.cpp \ src/net/common/clientexception.cpp \
src/net/common/netcontext.cpp \ src/net/common/netcontext.cpp \
src/net/common/netexception.cpp \ src/net/common/netexception.cpp \
@@ -200,8 +197,6 @@ win32{
DEFINES += CURL_STATICLIB DEFINES += CURL_STATICLIB
DEFINES += _WIN32_WINNT=0x0501 DEFINES += _WIN32_WINNT=0x0501
DEPENDPATH += src/net/win32/ src/core/win32 DEPENDPATH += src/net/win32/ src/core/win32
SOURCES += src/net/win32/socket_helper.cpp \
src/net/win32/socket_startup.cpp
INCLUDEPATH += ../boost/ ../GnuTLS/include ../curl/include ../zlib INCLUDEPATH += ../boost/ ../GnuTLS/include ../curl/include ../zlib
} }
!win32{ !win32{
@@ -209,8 +204,6 @@ win32{
#QMAKE_CXXFLAGS += -ffunction-sections -fdata-sections #QMAKE_CXXFLAGS += -ffunction-sections -fdata-sections
DEPENDPATH += src/net/linux/ src/core/linux DEPENDPATH += src/net/linux/ src/core/linux
SOURCES += src/net/linux/socket_helper.cpp \
src/net/linux/socket_startup.cpp
} }
mac{ mac{
+5 -5
View File
@@ -37,10 +37,10 @@ public:
void SetSessionData(boost::shared_ptr<SessionData> sessionData); void SetSessionData(boost::shared_ptr<SessionData> sessionData);
boost::shared_ptr<boost::asio::ip::tcp::resolver> GetResolver() const; boost::shared_ptr<boost::asio::ip::tcp::resolver> GetResolver() const;
void SetResolver(boost::shared_ptr<boost::asio::ip::tcp::resolver> resolver); void SetResolver(boost::shared_ptr<boost::asio::ip::tcp::resolver> resolver);
int GetProtocol() const bool GetSctp() const
{return m_protocol;} {return m_sctp;}
void SetProtocol(int protocol) void SetSctp(bool sctp)
{m_protocol = protocol;} {m_sctp = sctp;}
int GetAddrFamily() const int GetAddrFamily() const
{return m_addrFamily;} {return m_addrFamily;}
void SetAddrFamily(int addrFamily) void SetAddrFamily(int addrFamily)
@@ -92,7 +92,7 @@ public:
private: private:
boost::shared_ptr<SessionData> m_sessionData; boost::shared_ptr<SessionData> m_sessionData;
boost::shared_ptr<boost::asio::ip::tcp::resolver> m_resolver; boost::shared_ptr<boost::asio::ip::tcp::resolver> m_resolver;
int m_protocol; bool m_sctp;
int m_addrFamily; int m_addrFamily;
std::string m_serverAddr; std::string m_serverAddr;
std::string m_serverListUrl; std::string m_serverListUrl;
+1 -1
View File
@@ -21,7 +21,7 @@
ClientContext::ClientContext() ClientContext::ClientContext()
: m_protocol(0), m_addrFamily(AF_INET), m_useServerList(false), m_serverPort(0), : m_sctp(false), m_addrFamily(AF_INET), m_useServerList(false), m_serverPort(0),
m_hasSubscribedLobbyMsg(true) m_hasSubscribedLobbyMsg(true)
{ {
} }
+2 -2
View File
@@ -96,7 +96,7 @@ ClientThread::Init(
ClientContext &context = GetContext(); ClientContext &context = GetContext();
context.SetProtocol(sctp ? SOCKET_IPPROTO_SCTP : 0); context.SetSctp(sctp);
context.SetAddrFamily(ipv6 ? AF_INET6 : AF_INET); context.SetAddrFamily(ipv6 ? AF_INET6 : AF_INET);
context.SetServerAddr(serverAddress); context.SetServerAddr(serverAddress);
context.SetServerListUrl(serverListUrl); context.SetServerListUrl(serverListUrl);
@@ -839,7 +839,7 @@ ClientThread::CreateContextSession()
{ {
} }
if (!validSocket) if (!validSocket)
throw ClientException(__FILE__, __LINE__, ERR_SOCK_CREATION_FAILED, SOCKET_ERRNO()); throw ClientException(__FILE__, __LINE__, ERR_SOCK_CREATION_FAILED, 0);
} }
ClientState & ClientState &
-36
View File
@@ -1,36 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <net/connectdata.h>
#include <memory>
using namespace std;
ConnectData::ConnectData()
: m_sockfd(INVALID_SOCKET), m_peerAddrSize(sizeof(struct sockaddr_storage))
{
memset(&m_peerAddr, 0, sizeof(m_peerAddr));
}
ConnectData::~ConnectData()
{
if (m_sockfd != INVALID_SOCKET)
CLOSESOCKET(m_sockfd);
}
+3 -2
View File
@@ -29,6 +29,7 @@
using namespace std; using namespace std;
#define IRC_WAIT_TERMINATION_MSEC 500 #define IRC_WAIT_TERMINATION_MSEC 500
#define IRC_RECV_TIMEOUT_MSEC 50
#define IRC_MAX_RENAME_TRIES 5 #define IRC_MAX_RENAME_TRIES 5
#define IRC_MIN_RECONNECT_INTERVAL_SEC 60 #define IRC_MIN_RECONNECT_INTERVAL_SEC 60
@@ -415,12 +416,12 @@ IrcThread::IrcMain()
FD_ZERO(&readSet); FD_ZERO(&readSet);
FD_ZERO(&writeSet); FD_ZERO(&writeSet);
timeout.tv_sec = 0; timeout.tv_sec = 0;
timeout.tv_usec = RECV_TIMEOUT_MSEC * 1000; timeout.tv_usec = IRC_RECV_TIMEOUT_MSEC * 1000;
irc_add_select_descriptors(s, &readSet, &writeSet, &maxfd); irc_add_select_descriptors(s, &readSet, &writeSet, &maxfd);
int selectResult = select(maxfd + 1, &readSet, &writeSet, 0, &timeout); int selectResult = select(maxfd + 1, &readSet, &writeSet, 0, &timeout);
if (!IS_VALID_SELECT(selectResult)) if (selectResult == -1)
{ {
GetCallback().SignalIrcError(ERR_IRC_SELECT_FAILED); GetCallback().SignalIrcError(ERR_IRC_SELECT_FAILED);
break; break;
+2
View File
@@ -17,6 +17,8 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/ ***************************************************************************/
#include <boost/asio.hpp>
#include <net/netpacket.h> #include <net/netpacket.h>
#include <net/netexception.h> #include <net/netexception.h>
#include <net/socket_msg.h> #include <net/socket_msg.h>
-1
View File
@@ -20,7 +20,6 @@
#include <net/socket_helper.h> #include <net/socket_helper.h>
#include <net/servermanager.h> #include <net/servermanager.h>
#include <net/ircthread.h> #include <net/ircthread.h>
#include <net/connectdata.h>
#include <net/serverlobbythread.h> #include <net/serverlobbythread.h>
#include <net/serveraccepthelper.h> #include <net/serveraccepthelper.h>
#include <net/serverexception.h> #include <net/serverexception.h>
-70
View File
@@ -80,76 +80,6 @@ SessionManager::RemoveSession(SessionId session)
m_sessionMap.erase(session); m_sessionMap.erase(session);
} }
SessionWrapper
SessionManager::Select(unsigned timeoutMsec)
{
SessionWrapper retSession;
SOCKET maxSock = INVALID_SOCKET;
fd_set rdset;
FD_ZERO(&rdset);
{
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
SessionMap::iterator i = m_sessionMap.begin();
SessionMap::iterator end = m_sessionMap.end();
while (i != end)
{
// Collect all sockets.
SOCKET tmpSock = i->second.sessionData->GetSocket();
FD_SET(tmpSock, &rdset);
if (tmpSock > maxSock || maxSock == INVALID_SOCKET)
maxSock = tmpSock;
// Check if a packet is available.
if (!i->second.sessionData->GetReceiveBuffer().receivedPackets.empty())
{
retSession = i->second;
break;
}
++i;
}
}
if (!retSession.sessionData.get())
{
if (maxSock == INVALID_SOCKET)
{
Thread::Msleep(timeoutMsec); // just sleep if there is no session
}
else
{
// wait for data
struct timeval timeout;
timeout.tv_sec = timeoutMsec / 1000;
timeout.tv_usec = (timeoutMsec % 1000) * 1000;
int selectResult = select(maxSock + 1, &rdset, NULL, NULL, &timeout);
if (!IS_VALID_SELECT(selectResult))
{
throw ServerException(__FILE__, __LINE__, ERR_SOCK_SELECT_FAILED, SOCKET_ERRNO());
}
if (selectResult > 0) // one (or more) of the sockets is readable
{
// Check which socket is readable, return the first.
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
SessionMap::iterator i = m_sessionMap.begin();
SessionMap::iterator end = m_sessionMap.end();
while (i != end)
{
if (FD_ISSET(i->second.sessionData->GetSocket(), &rdset))
{
retSession = i->second;
break;
}
++i;
}
}
}
}
return retSession;
}
SessionWrapper SessionWrapper
SessionManager::GetSessionById(SessionId id) const SessionManager::GetSessionById(SessionId id) const
{ {
+18 -14
View File
@@ -17,15 +17,16 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/ ***************************************************************************/
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/version.hpp> // solve compatibility issues
#include <net/socket_startup.h> #include <net/socket_startup.h>
#include <net/socket_helper.h>
#include <core/openssl_wrapper.h> #include <core/openssl_wrapper.h>
#ifdef PKTH_USE_GNUTLS #ifdef PKTH_USE_GNUTLS
#include <gcrypt.h> #include <gcrypt.h>
#include <boost/thread.hpp>
#include <boost/version.hpp> // solve compatibility issues
extern "C" { extern "C" {
@@ -68,7 +69,7 @@ extern "C" {
#endif // PKTH_USE_GNUTLS #endif // PKTH_USE_GNUTLS
bool bool
internal_socket_startup() socket_startup()
{ {
#ifdef PKTH_USE_GNUTLS #ifdef PKTH_USE_GNUTLS
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_boost); gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_boost);
@@ -78,7 +79,7 @@ internal_socket_startup()
} }
void void
internal_socket_cleanup() socket_cleanup()
{ {
} }
@@ -87,11 +88,12 @@ bool
socket_has_sctp() socket_has_sctp()
{ {
#ifdef IPPROTO_SCTP #ifdef IPPROTO_SCTP
SOCKET test = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); boost::asio::detail::socket_type test = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
if (test == INVALID_SOCKET) if (test == boost::asio::detail::invalid_socket)
return false; return false;
CLOSESOCKET(test); boost::system::error_code ec;
boost::asio::detail::socket_ops::close(test, ec);
return true; return true;
#else #else
return false; return false;
@@ -101,11 +103,12 @@ socket_has_sctp()
bool bool
socket_has_ipv6() socket_has_ipv6()
{ {
SOCKET test = socket(AF_INET6, SOCK_STREAM, 0); boost::asio::detail::socket_type test = socket(AF_INET6, SOCK_STREAM, 0);
if (test == INVALID_SOCKET) if (test == boost::asio::detail::invalid_socket)
return false; return false;
CLOSESOCKET(test); boost::system::error_code ec;
boost::asio::detail::socket_ops::close(test, ec);
return true; return true;
} }
@@ -113,14 +116,15 @@ bool
socket_has_dual_stack() socket_has_dual_stack()
{ {
bool retVal = false; bool retVal = false;
SOCKET test = socket(AF_INET6, SOCK_STREAM, 0); boost::asio::detail::socket_type test = socket(AF_INET6, SOCK_STREAM, 0);
if (test != INVALID_SOCKET) if (test != boost::asio::detail::invalid_socket)
{ {
int ipv6only = 0; int ipv6only = 0;
if (setsockopt(test, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&ipv6only, sizeof(ipv6only)) == 0) if (setsockopt(test, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&ipv6only, sizeof(ipv6only)) == 0)
retVal = true; retVal = true;
CLOSESOCKET(test); boost::system::error_code ec;
boost::asio::detail::socket_ops::close(test, ec);
} }
return retVal; return retVal;
} }
+4 -3
View File
@@ -27,6 +27,7 @@
using namespace std; using namespace std;
#define CURL_RECV_TIMEOUT_MSEC 50
TransferHelper::TransferHelper() TransferHelper::TransferHelper()
{ {
@@ -91,15 +92,15 @@ TransferHelper::Process()
FD_ZERO(&exceptSet); FD_ZERO(&exceptSet);
timeout.tv_sec = 0; timeout.tv_sec = 0;
timeout.tv_usec = RECV_TIMEOUT_MSEC * 1000; timeout.tv_usec = CURL_RECV_TIMEOUT_MSEC * 1000;
curl_multi_fdset(m_data->curlMultiHandle, &readSet, &writeSet, &exceptSet, &maxfd); curl_multi_fdset(m_data->curlMultiHandle, &readSet, &writeSet, &exceptSet, &maxfd);
if (maxfd >= 0) if (maxfd >= 0)
{ {
int selectResult = select(maxfd+1, &readSet, &writeSet, &exceptSet, &timeout); int selectResult = select(maxfd+1, &readSet, &writeSet, &exceptSet, &timeout);
if (!IS_VALID_SELECT(selectResult)) if (selectResult == -1)
throw NetException(__FILE__, __LINE__, ERR_SOCK_TRANSFER_SELECT_FAILED, SOCKET_ERRNO()); throw NetException(__FILE__, __LINE__, ERR_SOCK_TRANSFER_SELECT_FAILED, 0);
} }
} }
else else
-46
View File
@@ -1,46 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/* Connection data. */
#ifndef _CONNECTDATA_H_
#define _CONNECTDATA_H_
#include <net/socket_helper.h>
class ConnectData
{
public:
ConnectData();
~ConnectData();
SOCKET GetSocket() const
{return m_sockfd;}
void SetSocket(SOCKET sockfd)
{m_sockfd = sockfd;}
SOCKET GetSocket();
private:
SOCKET m_sockfd;
struct sockaddr_storage m_peerAddr;
int m_peerAddrSize;
};
#endif
-79
View File
@@ -1,79 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifdef _WIN32
#error This source code is not for Win32.
#endif
#include <net/socket_helper.h>
bool
socket_string_to_addr(const char *str, int addrFamily, struct sockaddr *addr, int /*addrLen*/)
{
if (addrFamily == AF_INET)
return (inet_pton(addrFamily, str, &((struct sockaddr_in *)addr)->sin_addr) == 1);
else if (addrFamily == AF_INET6)
return (inet_pton(addrFamily, str, &((struct sockaddr_in6 *)addr)->sin6_addr) == 1);
else
return false;
}
bool
socket_addr_to_string(struct sockaddr *addr, int /*addrLen*/, int addrFamily, char *str, int strLen)
{
if (addrFamily == AF_INET)
return (inet_ntop(addrFamily, &((struct sockaddr_in *)addr)->sin_addr, str, strLen) != NULL);
else if (addrFamily == AF_INET6)
return (inet_ntop(addrFamily, &((struct sockaddr_in6 *)addr)->sin6_addr, str, strLen) != NULL);
else
return false;
}
bool
socket_resolve(const char *str, const char *port, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen)
{
bool retVal = false;
if (str && *str != 0)
{
struct addrinfo aiHints;
struct addrinfo *aiList = NULL;
memset(&aiHints, 0, sizeof(aiHints));
aiHints.ai_family = addrFamily;
aiHints.ai_socktype = sockType;
aiHints.ai_protocol = protocol;
// Try to resolve the name.
// Will (hopefully) use UTF-8 if called on Linux.
bool success = (getaddrinfo(str, port, &aiHints, &aiList) == 0);
if (success && aiList)
{
if ((int)aiList->ai_addrlen <= addrLen)
{
memcpy(addr, aiList->ai_addr, aiList->ai_addrlen);
retVal = true;
}
freeaddrinfo(aiList);
}
}
return retVal;
}
-43
View File
@@ -1,43 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifdef _WIN32
#error This source code is not for Win32.
#endif
#include <net/socket_startup.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
using namespace std;
bool
socket_startup()
{
return internal_socket_startup();
}
void
socket_cleanup()
{
internal_socket_cleanup();
}
-1
View File
@@ -53,7 +53,6 @@ public:
void SetSessionPlayerData(SessionId session, boost::shared_ptr<PlayerData> playerData); void SetSessionPlayerData(SessionId session, boost::shared_ptr<PlayerData> playerData);
void RemoveSession(SessionId session); void RemoveSession(SessionId session);
SessionWrapper Select(unsigned timeoutMsec);
SessionWrapper GetSessionById(SessionId id) const; SessionWrapper GetSessionById(SessionId id) const;
SessionWrapper GetSessionByPlayerName(const std::string playerName) const; SessionWrapper GetSessionByPlayerName(const std::string playerName) const;
SessionWrapper GetSessionByUniquePlayerId(unsigned uniqueId) const; SessionWrapper GetSessionByUniquePlayerId(unsigned uniqueId) const;
+3 -69
View File
@@ -16,28 +16,16 @@
* Free Software Foundation, Inc., * * Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/ ***************************************************************************/
/* Socket helper defines and functions. */ /* Socket helper defines. */
#ifndef _SOCKET_HELPER_H_ #ifndef _SOCKET_HELPER_H_
#define _SOCKET_HELPER_H_ #define _SOCKET_HELPER_H_
#include <net/genericsocket.h>
#ifndef bzero #ifndef bzero
#include <cstring> #include <cstring>
#define bzero(_ptr, _n) std::memset(_ptr, 0, _n) #define bzero(_ptr, _n) std::memset(_ptr, 0, _n)
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
#define CLOSESOCKET closesocket
#define IOCTLSOCKET ioctlsocket
#define SOCKET_ERRNO() WSAGetLastError()
#define IS_SOCKET_ERR_WOULDBLOCK(_e) ((_e) == WSAEWOULDBLOCK)
#define SOCKET_ERR_NOTCONN WSAENOTCONN
#define SOCKET_ERR_NOTSOCK WSAENOTSOCK
#ifndef IPV6_V6ONLY
#define IPV6_V6ONLY 27
#endif
#ifdef __GNUC__ /* mingw provides stdint.h */ #ifdef __GNUC__ /* mingw provides stdint.h */
#include <stdint.h> #include <stdint.h>
@@ -53,66 +41,12 @@
typedef unsigned char u_char; typedef unsigned char u_char;
#else #else
#define SOCKET int
#define SOCKET_ERROR -1
#define INVALID_SOCKET -1
#define CLOSESOCKET close
#define SOCKET_ERRNO() errno
#define IOCTLSOCKET ioctl
#define SOCKET_ERR_NOTCONN ENOTCONN
#define SOCKET_ERR_NOTSOCK ENOTSOCK
#define IS_SOCKET_ERR_WOULDBLOCK(_e) ((_e) == EINPROGRESS || (_e) == EAGAIN || (_e) == EWOULDBLOCK) #include <sys/types.h>
#endif #endif // _WIN32
#define IS_VALID_SOCKET(_s) ((_s) != INVALID_SOCKET)
#define IS_VALID_CONNECT(_c) ((_c) == 0)
#define IS_VALID_BIND(_b) ((_b) != SOCKET_ERROR)
#define IS_VALID_LISTEN(_l) ((_l) != SOCKET_ERROR)
#define IS_VALID_RECV(_r) ((_r) != SOCKET_ERROR)
#define IS_VALID_SEND(_s) ((_s) != SOCKET_ERROR)
#define IS_VALID_SELECT(_s) ((_s) != SOCKET_ERROR)
#define RECV_TIMEOUT_MSEC 50
#ifdef MSG_NOSIGNAL
#define SOCKET_SEND_FLAGS MSG_NOSIGNAL
#else
#define SOCKET_SEND_FLAGS 0
#endif
#ifdef IPPROTO_SCTP
#define SOCKET_IPPROTO_SCTP IPPROTO_SCTP
#else
#define SOCKET_IPPROTO_SCTP 0
#endif
#define MAX_ADDR_STRING_LEN 256 #define MAX_ADDR_STRING_LEN 256
// All char *s are assumed to be UTF-8.
/**
* Convert an address string to a numeric address.
* str is assumed to be UTF-8 encoded.
*/
bool socket_string_to_addr(const char *str, int addrFamily, struct sockaddr *addr, int addrLen);
/**
* Convert a numeric address to an address string.
*/
bool socket_addr_to_string(struct sockaddr *addr, int addrLen, int addrFamily, char *str, int strLen);
/**
* Resolve a name to a numeric address.
* str is assumed to be UTF-8 encoded.
*/
bool socket_resolve(const char *str, const char *port, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen);
/**
* Set the port in the sockaddr structure.
*/
bool socket_set_port(unsigned port, int addrFamily, struct sockaddr *addr, int addrLen);
#endif #endif
-4
View File
@@ -27,10 +27,6 @@ bool socket_has_sctp();
bool socket_has_ipv6(); bool socket_has_ipv6();
bool socket_has_dual_stack(); bool socket_has_dual_stack();
/* Internal common functions. */
bool internal_socket_startup();
void internal_socket_cleanup();
#endif #endif
-146
View File
@@ -1,146 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef _WIN32
#error This source code is Win32 only.
#endif
#include <net/socket_helper.h>
#include <windows.h>
#include <string>
#include <cstring>
using namespace std;
typedef int (WSAAPI * getaddrinfo_ptr_t) (const char *, const char* , const struct addrinfo *, struct addrinfo **);
typedef void (WSAAPI * freeaddrinfo_ptr_t) (struct addrinfo*);
static wstring
utf8ToWchar(const char *str)
{
// convert str from UTF-8 to UTF-16 (Win32 byte order)
wstring retStr;
if (str)
{
size_t len = strlen(str) + 1;
if (len > 1)
{
size_t reqLen = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, len, NULL, 0);
if (reqLen)
{
wchar_t *wstr = new wchar_t[reqLen];
wstr[0] = L'\0';
if (::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, len, wstr, reqLen) == (int)reqLen)
retStr = wstr;
delete[] wstr;
}
}
}
return retStr;
}
bool
socket_string_to_addr(const char *str, int addrFamily, struct sockaddr * addr, int addrLen)
{
bool retVal = false;
#ifdef UNICODE
// convert str from UTF-8 to UTF-16 (Win32 byte order)
wstring wstr(utf8ToWchar(str));
if (!wstr.empty())
retVal = (WSAStringToAddress((LPWSTR)wstr.c_str(), addrFamily, NULL, addr, &addrLen) != SOCKET_ERROR);
#else
if (str && *str != 0)
retVal = (WSAStringToAddress(str, addrFamily, NULL, addr, &addrLen) != SOCKET_ERROR);
#endif
return retVal;
}
bool
socket_addr_to_string(struct sockaddr *addr, int addrLen, int /*addrFamily*/, char *str, int strLen)
{
bool retVal = false;
retVal = (WSAAddressToStringA(addr, addrLen, NULL, str, (DWORD *)&strLen) != SOCKET_ERROR);
return retVal;
}
bool
socket_resolve(const char *str, const char *port, int addrFamily, int sockType, int protocol, struct sockaddr *addr, int addrLen)
{
bool retVal = false;
bool useGetaddrinfo = false;
if (str && *str != 0)
{
HMODULE hWsock = ::LoadLibraryA("ws2_32");
if (hWsock)
{
// Determine functions at runtime, because windows systems < XP do not
// support getaddrinfo.
getaddrinfo_ptr_t getaddrinfo_ptr = (getaddrinfo_ptr_t)::GetProcAddress(hWsock, "getaddrinfo");
freeaddrinfo_ptr_t freeaddrinfo_ptr = (freeaddrinfo_ptr_t)::GetProcAddress(hWsock, "freeaddrinfo");
if (getaddrinfo_ptr && freeaddrinfo_ptr)
{
useGetaddrinfo = true;
struct addrinfo aiHints;
struct addrinfo *aiList = NULL;
memset(&aiHints, 0, sizeof(aiHints));
aiHints.ai_family = addrFamily;
aiHints.ai_socktype = sockType;
aiHints.ai_protocol = protocol;
// Try to resolve the name.
bool success = (getaddrinfo_ptr(str, port, &aiHints, &aiList) == 0);
if (success && aiList)
{
if ((int)aiList->ai_addrlen <= addrLen)
{
memcpy(addr, aiList->ai_addr, aiList->ai_addrlen);
retVal = true;
}
freeaddrinfo_ptr(aiList);
}
}
::FreeLibrary(hWsock);
}
// If we cannot use getaddrinfo (OS older than XP),
// we call the "classic" gethostbyname.
if (!useGetaddrinfo && addrFamily == AF_INET)
{
struct hostent *host = gethostbyname(str);
if (host && host->h_addr_list)
{
struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
addr_in->sin_family = AF_INET;
addr_in->sin_port = htons(atoi(port));
memcpy(&addr_in->sin_addr, host->h_addr_list[0], host->h_length);
retVal = true;
}
}
}
return retVal;
}
-69
View File
@@ -1,69 +0,0 @@
/***************************************************************************
* Copyright (C) 2007 by Lothar May *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef _WIN32
#error This source code is Win32 only.
#endif
#include <net/socket_startup.h>
#include <net/socket_helper.h>
#define USE_SOCKET_VERSION_MAJOR 2
#define USE_SOCKET_VERSION_MINOR 2
bool
socket_startup()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(USE_SOCKET_VERSION_MAJOR, USE_SOCKET_VERSION_MINOR);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return false;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if (LOBYTE(wsaData.wVersion) != USE_SOCKET_VERSION_MAJOR ||
HIBYTE(wsaData.wVersion) != USE_SOCKET_VERSION_MINOR) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return false;
}
/* The WinSock DLL is acceptable. Proceed. */
return internal_socket_startup();
}
void
socket_cleanup()
{
internal_socket_cleanup();
WSACleanup();
}