This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch next_stable
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/next_stable by this push:
     new a3e4041b LOGCXX-549 (#114)
a3e4041b is described below

commit a3e4041b90cc497ab6135524968cdb8b99466cf1
Author: Robert Middleton <[email protected]>
AuthorDate: Sat Aug 20 15:47:11 2022 -0400

    LOGCXX-549 (#114)
    
    * LOGCXX-549 Turned the Socket and SocketServer classes into non 
APR-specific classes
    
    * Remove uneeded forward declaration
    
    * Make the datagram socket abstract
    
    * Optionally configure for networking support or not
    
    * Add header include to fix compile issue on windows
    
    * check for NTEventLogAppender if windows
---
 CMakeLists.txt                                     |  21 ++
 src/main/cpp/CMakeLists.txt                        |  34 ++-
 .../{datagramsocket.cpp => aprdatagramsocket.cpp}  | 264 ++++++++-------------
 .../cpp/{serversocket.cpp => aprserversocket.cpp}  |  80 +++----
 src/main/cpp/{socket.cpp => aprsocket.cpp}         |  81 +++----
 src/main/cpp/class.cpp                             |  14 +-
 src/main/cpp/datagramsocket.cpp                    | 224 ++---------------
 src/main/cpp/serversocket.cpp                      | 135 +----------
 src/main/cpp/socket.cpp                            | 129 +---------
 src/main/cpp/socketappenderskeleton.cpp            |   4 +-
 src/main/cpp/sockethubappender.cpp                 |   7 +-
 src/main/cpp/syslogwriter.cpp                      |   2 +-
 src/main/cpp/telnetappender.cpp                    |   2 +-
 src/main/include/CMakeLists.txt                    |   6 +
 src/main/include/log4cxx/helpers/datagramsocket.h  |  57 +++--
 src/main/include/log4cxx/helpers/serversocket.h    |  25 +-
 src/main/include/log4cxx/helpers/socket.h          |  44 ++--
 src/main/include/log4cxx/log4cxx.h.in              |   3 +-
 .../serversocket.h => private/aprdatagramsocket.h} |  61 +++--
 .../serversocket.h => private/aprserversocket.h}   |  51 ++--
 .../serversocket.h => private/aprsocket.h}         |  49 ++--
 .../datagramsocket_priv.h}                         |  58 ++---
 .../serversocket.h => private/serversocket_priv.h} |  48 +---
 .../serversocket.h => private/socket_priv.h}       |  48 +---
 src/test/cpp/helpers/CMakeLists.txt                |   6 +-
 src/test/cpp/net/CMakeLists.txt                    |  17 +-
 26 files changed, 472 insertions(+), 998 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a4b96376..bee6dcc8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -190,6 +190,12 @@ foreach(varName HAS_STD_LOCALE  HAS_ODBC  HAS_MBSRTOWCS  
HAS_WCSTOMBS  HAS_FWIDE
   endif()
 endforeach()
 
+if(${WIN32})
+    set(HAS_NT_EVENTLOG_APPENDER "ON")
+else()
+    set(HAS_NT_EVENTLOG_APPENDER "OFF")
+endif()
+
 #
 # Package and sign if Apache maintainer
 #
@@ -242,6 +248,7 @@ message(STATUS "  charset ......................... : 
${LOG4CXX_CHARSET}")
 message(STATUS "  Using libESMTP .................. : ${HAS_LIBESMTP}")
 message(STATUS "  ODBC library .................... : ${HAS_ODBC}")
 message(STATUS "  syslog .......................... : ${HAS_SYSLOG}")
+message(STATUS "  Networking support .............. : 
${LOG4CXX_NETWORKING_SUPPORT}")
 message(STATUS "  Qt support ...................... : ${LOG4CXX_QT_SUPPORT}")
 message(STATUS "C++ version and Boost settings:")
 message(STATUS "  Prefer boost: ................... : ${PREFER_BOOST}")
@@ -257,3 +264,17 @@ message(STATUS "  zip ............................. : 
${ZIP_APP}")
 message(STATUS "  sed ............................. : ${SED_APP}")
 message(STATUS "  gzip ............................ : ${GZIP_APP}")
 endif(BUILD_TESTING)
+
+message(STATUS "Available appenders:")
+message(STATUS "  Async Appender .................. : ON")
+message(STATUS "  ODBC Appender ................... : ${HAS_ODBC}")
+message(STATUS "  SMTP Appender ................... : ${HAS_LIBESMTP}")
+message(STATUS "  XMLSocketAppender ............... : 
${LOG4CXX_NETWORKING_SUPPORT}")
+message(STATUS "  SocketHubAppender ............... : 
${LOG4CXX_NETWORKING_SUPPORT}")
+message(STATUS "  SyslogAppender .................. : 
${LOG4CXX_NETWORKING_SUPPORT}")
+message(STATUS "  TelnetAppender .................. : 
${LOG4CXX_NETWORKING_SUPPORT}")
+message(STATUS "  NTEventLogAppender .............. : 
${HAS_NT_EVENTLOG_APPENDER}")
+message(STATUS "  OutputDebugStringAppender ....... : 
${LOG4CXX_NETWORKING_SUPPORT}")
+message(STATUS "  ConsoleAppender ................. : ON")
+message(STATUS "  FileAppender .................... : ON")
+message(STATUS "  RollingFileAppender ............. : ON")
diff --git a/src/main/cpp/CMakeLists.txt b/src/main/cpp/CMakeLists.txt
index 8f9c16d5..065a7dee 100644
--- a/src/main/cpp/CMakeLists.txt
+++ b/src/main/cpp/CMakeLists.txt
@@ -27,6 +27,28 @@ else()
     target_compile_definitions(log4cxx PUBLIC LOG4CXX_STATIC)
 endif()
 add_dependencies(log4cxx configure_log4cxx)
+
+if(LOG4CXX_NETWORKING_SUPPORT)
+    set(networking_classes
+       datagrampacket.cpp
+       datagramsocket.cpp
+       aprdatagramsocket.cpp
+       serversocket.cpp
+       aprserversocket.cpp
+       socket.cpp
+       aprsocket.cpp
+       telnetappender.cpp
+       socketappenderskeleton.cpp
+       sockethubappender.cpp
+       socketoutputstream.cpp
+       xmlsocketappender.cpp
+       syslogwriter.cpp
+       syslogappender.cpp
+       )
+else()
+    set(networking_classes "")
+endif()
+
 target_sources(log4cxx
   PRIVATE
   action.cpp
@@ -51,8 +73,6 @@ target_sources(log4cxx
   configurator.cpp
   consoleappender.cpp
   cyclicbuffer.cpp
-  datagrampacket.cpp
-  datagramsocket.cpp
   date.cpp
   dateformat.cpp
   datepatternconverter.cpp
@@ -139,26 +159,18 @@ target_sources(log4cxx
   rollingpolicybase.cpp
   rolloverdescription.cpp
   rootlogger.cpp
-  serversocket.cpp
   shortfilelocationpatternconverter.cpp
   simpledateformat.cpp
   simplelayout.cpp
   sizebasedtriggeringpolicy.cpp
   smtpappender.cpp
-  socket.cpp
-  socketappenderskeleton.cpp
-  sockethubappender.cpp
-  socketoutputstream.cpp
   strftimedateformat.cpp
   stringhelper.cpp
   stringmatchfilter.cpp
   stringtokenizer.cpp
-  syslogappender.cpp
-  syslogwriter.cpp
   system.cpp
   systemerrwriter.cpp
   systemoutwriter.cpp
-  telnetappender.cpp
   threadlocal.cpp
   threadpatternconverter.cpp
   threadusernamepatternconverter.cpp
@@ -173,8 +185,8 @@ target_sources(log4cxx
   writer.cpp
   writerappender.cpp
   xmllayout.cpp
-  xmlsocketappender.cpp
   zipcompressaction.cpp
+  ${networking_classes}
 )
 set_target_properties(log4cxx PROPERTIES
   VERSION ${LIBLOG4CXX_LIB_VERSION}
diff --git a/src/main/cpp/datagramsocket.cpp 
b/src/main/cpp/aprdatagramsocket.cpp
similarity index 53%
copy from src/main/cpp/datagramsocket.cpp
copy to src/main/cpp/aprdatagramsocket.cpp
index 0aa46ff9..f337736f 100644
--- a/src/main/cpp/datagramsocket.cpp
+++ b/src/main/cpp/aprdatagramsocket.cpp
@@ -14,168 +14,61 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/logstring.h>
-#include <log4cxx/helpers/datagramsocket.h>
-#include <log4cxx/helpers/datagrampacket.h>
-#include <log4cxx/helpers/loglog.h>
+
+#include <log4cxx/private/aprdatagramsocket.h>
+#include <log4cxx/private/datagramsocket_priv.h>
 #include <log4cxx/helpers/transcoder.h>
+#include <apr_network_io.h>
 
-#include "apr_network_io.h"
-#include "apr_lib.h"
+using log4cxx::helpers::APRDatagramSocket;
 
-using namespace log4cxx::helpers;
+#define _priv static_cast<APRDatagramSocketPriv*>(m_priv.get())
 
-struct DatagramSocket::DatagramSocketPriv
-{
-       DatagramSocketPriv()
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+struct APRDatagramSocket::APRDatagramSocketPriv : public DatagramSocketPriv {
+       APRDatagramSocketPriv() :
+               DatagramSocketPriv(),
+               socket(nullptr)
+       {}
 
-       DatagramSocketPriv(int localPort1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+       APRDatagramSocketPriv(int port) :
+               DatagramSocketPriv(port),
+               socket(nullptr)
+       {}
 
-       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
+       APRDatagramSocketPriv(int port, InetAddressPtr localAddress) :
+               DatagramSocketPriv(port, localAddress),
+               socket(nullptr)
+       {}
 
        /** The APR socket */
        apr_socket_t* socket;
 
        /** The memory pool for the socket */
        Pool socketPool;
-
-       InetAddressPtr address;
-
-       InetAddressPtr localAddress;
-
-       int port;
-
-       /** The local port number to which this socket is connected. */
-       int localPort;
 };
 
-IMPLEMENT_LOG4CXX_OBJECT(DatagramSocket)
-
-DatagramSocket::DatagramSocket()
-       : m_priv(std::make_unique<DatagramSocketPriv>())
-{
-       create();
-}
-
-DatagramSocket::DatagramSocket(int localPort1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1))
-{
-       InetAddressPtr bindAddr = InetAddress::anyAddress();
-
-       create();
-       bind(localPort1, bindAddr);
-}
-
-DatagramSocket::DatagramSocket(int localPort1, InetAddressPtr localAddress1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1, 
localAddress1))
-{
-       create();
-       bind(localPort1, localAddress1);
-}
-
-DatagramSocket::~DatagramSocket()
-{
-       try
-       {
-               close();
-       }
-       catch (SocketException&)
-       {
-       }
-}
-
-/**  Binds a datagram socket to a local port and address.*/
-void DatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
-{
-       Pool addrPool;
-
-       // Create server socket address (including port number)
-       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
-       apr_sockaddr_t* server_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
-                       localPort1, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(m_priv->socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       m_priv->localPort = localPort1;
-       m_priv->localAddress = localAddress1;
+APRDatagramSocket::APRDatagramSocket() :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>()){
+       init();
 }
 
-/** Close the socket.*/
-void DatagramSocket::close()
-{
-       if (m_priv->socket != 0)
-       {
-               apr_status_t status = apr_socket_close(m_priv->socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               m_priv->socket = 0;
-               m_priv->localPort = 0;
-       }
+APRDatagramSocket::APRDatagramSocket(int port) :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>(port)){
+       init();
 }
 
-void DatagramSocket::connect(InetAddressPtr address1, int port1)
-{
-
-       m_priv->address = address1;
-       m_priv->port = port1;
-
-       Pool addrPool;
-
-       // create socket address
-       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
-       apr_sockaddr_t* client_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
-                       m_priv->port, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status = apr_socket_connect(m_priv->socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
+APRDatagramSocket::APRDatagramSocket(int port, InetAddressPtr laddr) :
+       DatagramSocket(std::make_unique<APRDatagramSocketPriv>(port, laddr)){
+       init();
 }
 
-/** Creates a datagram socket.*/
-void DatagramSocket::create()
+void APRDatagramSocket::init()
 {
        apr_socket_t* newSocket;
        apr_status_t status =
                apr_socket_create(&newSocket, APR_INET, SOCK_DGRAM,
-                       APR_PROTO_UDP, m_priv->socketPool.getAPRPool());
-       m_priv->socket = newSocket;
+                       APR_PROTO_UDP, _priv->socketPool.getAPRPool());
+       _priv->socket = newSocket;
 
        if (status != APR_SUCCESS)
        {
@@ -183,8 +76,7 @@ void DatagramSocket::create()
        }
 }
 
-/** Receive the datagram packet.*/
-void DatagramSocket::receive(DatagramPacketPtr& p)
+void APRDatagramSocket::receive(DatagramPacketPtr& p)
 {
        Pool addrPool;
 
@@ -202,7 +94,7 @@ void DatagramSocket::receive(DatagramPacketPtr& p)
 
        // receive the datagram packet
        apr_size_t len = p->getLength();
-       status = apr_socket_recvfrom(addr, m_priv->socket, 0,
+       status = apr_socket_recvfrom(addr, _priv->socket, 0,
                        (char*)p->getData(), &len);
 
        if (status != APR_SUCCESS)
@@ -211,8 +103,7 @@ void DatagramSocket::receive(DatagramPacketPtr& p)
        }
 }
 
-/**  Sends a datagram packet.*/
-void DatagramSocket::send(DatagramPacketPtr& p)
+void APRDatagramSocket::send(DatagramPacketPtr& p)
 {
        Pool addrPool;
 
@@ -230,7 +121,7 @@ void DatagramSocket::send(DatagramPacketPtr& p)
 
        // send the datagram packet
        apr_size_t len = p->getLength();
-       status = apr_socket_sendto(m_priv->socket, addr, 0,
+       status = apr_socket_sendto(_priv->socket, addr, 0,
                        (char*)p->getData(), &len);
 
        if (status != APR_SUCCESS)
@@ -239,37 +130,80 @@ void DatagramSocket::send(DatagramPacketPtr& p)
        }
 }
 
-InetAddressPtr DatagramSocket::getInetAddress() const
-{
-       return m_priv->address;
-}
+void APRDatagramSocket::close(){
+       if (_priv->socket != 0)
+       {
+               apr_status_t status = apr_socket_close(_priv->socket);
 
-InetAddressPtr DatagramSocket::getLocalAddress() const
-{
-       return m_priv->localAddress;
-}
+               if (status != APR_SUCCESS)
+               {
+                       throw SocketException(status);
+               }
 
-int DatagramSocket::getLocalPort() const
-{
-       return m_priv->localPort;
+               _priv->socket = 0;
+               _priv->localPort = 0;
+       }
 }
 
-int DatagramSocket::getPort() const
+void APRDatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
 {
-       return m_priv->port;
-}
+       Pool addrPool;
 
-bool DatagramSocket::isBound() const
-{
-       return m_priv->localPort != 0;
+       // Create server socket address (including port number)
+       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
+       apr_sockaddr_t* server_addr;
+       apr_status_t status =
+               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
+                       localPort1, 0, addrPool.getAPRPool());
+
+       if (status != APR_SUCCESS)
+       {
+               throw BindException(status);
+       }
+
+       // bind the socket to the address
+       status = apr_socket_bind(_priv->socket, server_addr);
+
+       if (status != APR_SUCCESS)
+       {
+               throw BindException(status);
+       }
+
+       m_priv->localPort = localPort1;
+       m_priv->localAddress = localAddress1;
 }
 
-bool DatagramSocket::isClosed() const
+
+void APRDatagramSocket::connect(InetAddressPtr address1, int port1)
 {
-       return m_priv->socket != 0;
+       m_priv->address = address1;
+       m_priv->port = port1;
+
+       Pool addrPool;
+
+       // create socket address
+       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
+       apr_sockaddr_t* client_addr;
+       apr_status_t status =
+               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
+                       m_priv->port, 0, addrPool.getAPRPool());
+
+       if (status != APR_SUCCESS)
+       {
+               throw ConnectException(status);
+       }
+
+       // connect the socket
+       status = apr_socket_connect(_priv->socket, client_addr);
+
+       if (status != APR_SUCCESS)
+       {
+               throw ConnectException(status);
+       }
 }
 
-bool DatagramSocket::isConnected() const
+
+bool APRDatagramSocket::isClosed() const
 {
-       return m_priv->port != 0;
+       return _priv->socket != nullptr;
 }
diff --git a/src/main/cpp/serversocket.cpp b/src/main/cpp/aprserversocket.cpp
similarity index 64%
copy from src/main/cpp/serversocket.cpp
copy to src/main/cpp/aprserversocket.cpp
index 1cc9a3b9..797b5a1b 100644
--- a/src/main/cpp/serversocket.cpp
+++ b/src/main/cpp/aprserversocket.cpp
@@ -15,28 +15,35 @@
  * limitations under the License.
  */
 
-#include <log4cxx/helpers/serversocket.h>
-#include <mutex>
+#include <log4cxx/private/aprserversocket.h>
+#include <log4cxx/private/serversocket_priv.h>
+#include <log4cxx/private/aprsocket.h>
 #include "apr_network_io.h"
 #include "apr_pools.h"
 #include "apr_poll.h"
 
-using namespace log4cxx::helpers;
+using log4cxx::helpers::APRServerSocket;
 
-/**  Creates a server socket on a specified port.
-*/
-ServerSocket::ServerSocket(int port) : pool(), socket(0), timeout(0)
-{
+#define _priv static_cast<APRServerSocketPriv*>(m_priv.get())
+
+struct APRServerSocket::APRServerSocketPriv : public ServerSocketPrivate {
+       Pool pool;
+       std::mutex mutex;
+       apr_socket_t* socket;
+};
+
+APRServerSocket::APRServerSocket(int port) :
+       ServerSocket(std::make_unique<APRServerSocketPriv>()){
        apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
+               apr_socket_create(&_priv->socket, APR_INET, SOCK_STREAM,
+                       APR_PROTO_TCP, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
                throw SocketException(status);
        }
 
-       status = apr_socket_opt_set(socket, APR_SO_NONBLOCK, 1);
+       status = apr_socket_opt_set(_priv->socket, APR_SO_NONBLOCK, 1);
 
        if (status != APR_SUCCESS)
        {
@@ -47,7 +54,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        apr_sockaddr_t* server_addr;
        status =
                apr_sockaddr_info_get(&server_addr, NULL, APR_INET,
-                       port, 0, pool.getAPRPool());
+                       port, 0, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
@@ -55,7 +62,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 
        // bind the socket to the address
-       status = apr_socket_bind(socket, server_addr);
+       status = apr_socket_bind(_priv->socket, server_addr);
 
        if (status != APR_SUCCESS)
        {
@@ -63,7 +70,7 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 
 
-       status = apr_socket_listen(socket, 50);
+       status = apr_socket_listen(_priv->socket, 50);
 
        if (status != APR_SUCCESS)
        {
@@ -71,50 +78,45 @@ ServerSocket::ServerSocket(int port) : pool(), socket(0), 
timeout(0)
        }
 }
 
+void APRServerSocket::close(){
+       std::unique_lock<std::mutex> lock(_priv->mutex);
 
-ServerSocket::~ServerSocket()
-{
-}
-
-void ServerSocket::close()
-{
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket != 0)
+       if (_priv->socket != 0)
        {
-               apr_status_t status = apr_socket_close(socket);
+               apr_status_t status = apr_socket_close(_priv->socket);
 
                if (status != APR_SUCCESS)
                {
                        throw SocketException(status);
                }
 
-               socket = 0;
+               _priv->socket = 0;
        }
 }
 
+
 /** Listens for a connection to be made to this socket and
 accepts it
 */
-SocketPtr ServerSocket::accept()
+log4cxx::helpers::SocketPtr APRServerSocket::accept()
 {
-       std::unique_lock<std::mutex> lock(mutex);
+       std::unique_lock<std::mutex> lock(_priv->mutex);
 
-       if (socket == 0)
+       if (_priv->socket == 0)
        {
                throw IOException();
        }
 
        apr_pollfd_t poll;
-       poll.p = pool.getAPRPool();
+       poll.p = _priv->pool.getAPRPool();
        poll.desc_type = APR_POLL_SOCKET;
        poll.reqevents = APR_POLLIN;
        poll.rtnevents = 0;
-       poll.desc.s = socket;
+       poll.desc.s = _priv->socket;
        poll.client_data = NULL;
 
        apr_int32_t signaled;
-       apr_interval_time_t to = timeout * 1000;
+       apr_interval_time_t to = _priv->timeout * 1000;
        apr_status_t status = apr_poll(&poll, 1, &signaled, to);
 
        if (APR_STATUS_IS_TIMEUP(status))
@@ -135,7 +137,7 @@ SocketPtr ServerSocket::accept()
        }
 
        apr_socket_t* newSocket;
-       status = apr_socket_accept(&newSocket, socket, newPool);
+       status = apr_socket_accept(&newSocket, _priv->socket, newPool);
 
        if (status != APR_SUCCESS)
        {
@@ -151,19 +153,5 @@ SocketPtr ServerSocket::accept()
                throw SocketException(status);
        }
 
-       return SocketPtr(new Socket(newSocket, newPool));
-}
-
-/** Retrive setting for SO_TIMEOUT.
-*/
-int ServerSocket::getSoTimeout() const
-{
-       return timeout;
-}
-
-/** Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.
-*/
-void ServerSocket::setSoTimeout(int newVal)
-{
-       timeout = newVal;
+       return std::make_shared<APRSocket>(newSocket, newPool);
 }
diff --git a/src/main/cpp/socket.cpp b/src/main/cpp/aprsocket.cpp
similarity index 64%
copy from src/main/cpp/socket.cpp
copy to src/main/cpp/aprsocket.cpp
index cdd8724f..33b0d6f8 100644
--- a/src/main/cpp/socket.cpp
+++ b/src/main/cpp/aprsocket.cpp
@@ -14,39 +14,51 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/helpers/socket.h>
+
+#include <log4cxx/private/aprsocket.h>
+#include <log4cxx/private/socket_priv.h>
 #include <log4cxx/helpers/bytebuffer.h>
 #include <log4cxx/helpers/transcoder.h>
+
 #include "apr_network_io.h"
 #include "apr_signal.h"
 
+using log4cxx::helpers::APRSocket;
 
-using namespace log4cxx;
-using namespace log4cxx::helpers;
+struct APRSocket::APRSocketPriv : public 
log4cxx::helpers::Socket::SocketPrivate {
+       APRSocketPriv() :
+               socket(nullptr)
+       {}
 
-IMPLEMENT_LOG4CXX_OBJECT(Socket)
+       APRSocketPriv(apr_socket_t* sock, apr_pool_t* p) :
+               pool(p, true),
+               socket(sock)
+       {}
 
-/** Creates a stream socket and connects it to the specified port
-number at the specified IP address.
-*/
-Socket::Socket(InetAddressPtr& addr, int prt) : pool(), socket(0), 
address(addr), port(prt)
-{
+       Pool pool;
+       apr_socket_t* socket;
+};
+
+#define _priv static_cast<APRSocketPriv*>(m_priv.get())
+
+APRSocket::APRSocket(InetAddressPtr& address, int port) :
+       Socket(std::make_unique<APRSocketPriv>()){
        apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
+               apr_socket_create(&_priv->socket, APR_INET, SOCK_STREAM,
+                       APR_PROTO_TCP, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
                throw SocketException(status);
        }
 
-       LOG4CXX_ENCODE_CHAR(host, addr->getHostAddress());
+       LOG4CXX_ENCODE_CHAR(host, address->getHostAddress());
 
        // create socket address (including port)
        apr_sockaddr_t* client_addr;
        status =
                apr_sockaddr_info_get(&client_addr, host.c_str(), APR_INET,
-                       prt, 0, pool.getAPRPool());
+                       port, 0, _priv->pool.getAPRPool());
 
        if (status != APR_SUCCESS)
        {
@@ -54,7 +66,7 @@ Socket::Socket(InetAddressPtr& addr, int prt) : pool(), 
socket(0), address(addr)
        }
 
        // connect the socket
-       status =  apr_socket_connect(socket, client_addr);
+       status =  apr_socket_connect(_priv->socket, client_addr);
 
        if (status != APR_SUCCESS)
        {
@@ -62,15 +74,14 @@ Socket::Socket(InetAddressPtr& addr, int prt) : pool(), 
socket(0), address(addr)
        }
 }
 
-Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
-       pool(p, true), socket(s)
-{
+APRSocket::APRSocket(apr_socket_t* s, apr_pool_t* pool) :
+       Socket(std::make_unique<APRSocketPriv>(s, pool)){
        apr_sockaddr_t* sa;
        apr_status_t status = apr_socket_addr_get(&sa, APR_REMOTE, s);
 
        if (status == APR_SUCCESS)
        {
-               port = sa->port;
+               _priv->port = sa->port;
                LogString remotename;
                LogString remoteip;
 
@@ -87,17 +98,13 @@ Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
                        Transcoder::decode(buf, remoteip);
                }
 
-               address = InetAddressPtr(new InetAddress(remotename, remoteip));
+               _priv->address = InetAddressPtr(new InetAddress(remotename, 
remoteip));
        }
 }
 
-Socket::~Socket()
-{
-}
-
-size_t Socket::write(ByteBuffer& buf)
+size_t APRSocket::write(ByteBuffer& buf)
 {
-       if (socket == 0)
+       if (_priv->socket == 0)
        {
                throw ClosedChannelException();
        }
@@ -114,10 +121,10 @@ size_t Socket::write(ByteBuffer& buf)
                // SIGPIPE handler.
 #if APR_HAVE_SIGACTION
                apr_sigfunc_t* old = apr_signal(SIGPIPE, SIG_IGN);
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
+               apr_status_t status = apr_socket_send(_priv->socket, 
buf.current(), &written);
                apr_signal(SIGPIPE, old);
 #else
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
+               apr_status_t status = apr_socket_send(_priv->socket, 
buf.current(), &written);
 #endif
 
                buf.position(buf.position() + written);
@@ -133,29 +140,17 @@ size_t Socket::write(ByteBuffer& buf)
 }
 
 
-void Socket::close()
+void APRSocket::close()
 {
-       if (socket != 0)
+       if (_priv->socket != 0)
        {
-               apr_status_t status = apr_socket_close(socket);
+               apr_status_t status = apr_socket_close(_priv->socket);
 
                if (status != APR_SUCCESS)
                {
                        throw SocketException(status);
                }
 
-               socket = 0;
+               _priv->socket = 0;
        }
 }
-
-InetAddressPtr Socket::getInetAddress() const
-{
-       return address;
-}
-
-int Socket::getPort() const
-{
-       return port;
-}
-
-
diff --git a/src/main/cpp/class.cpp b/src/main/cpp/class.cpp
index b3d8f659..d608a4d1 100644
--- a/src/main/cpp/class.cpp
+++ b/src/main/cpp/class.cpp
@@ -176,14 +176,6 @@ void Class::registerClasses()
        log4cxx::nt::OutputDebugStringAppender::registerClass();
 #endif
        SMTPAppender::registerClass();
-#if APR_HAS_THREADS
-       SocketHubAppender::registerClass();
-#endif
-       SyslogAppender::registerClass();
-#if APR_HAS_THREADS
-       TelnetAppender::registerClass();
-#endif
-       XMLSocketAppender::registerClass();
        HTMLLayout::registerClass();
        PatternLayout::registerClass();
        SimpleLayout::registerClass();
@@ -200,5 +192,11 @@ void Class::registerClasses()
        log4cxx::xml::DOMConfigurator::registerClass();
        log4cxx::PropertyConfigurator::registerClass();
        log4cxx::varia::FallbackErrorHandler::registerClass();
+#if LOG4CXX_HAS_NETWORKING
+       TelnetAppender::registerClass();
+       XMLSocketAppender::registerClass();
+       SocketHubAppender::registerClass();
+       SyslogAppender::registerClass();
+#endif
 }
 
diff --git a/src/main/cpp/datagramsocket.cpp b/src/main/cpp/datagramsocket.cpp
index 0aa46ff9..ac71ecbe 100644
--- a/src/main/cpp/datagramsocket.cpp
+++ b/src/main/cpp/datagramsocket.cpp
@@ -19,68 +19,19 @@
 #include <log4cxx/helpers/datagrampacket.h>
 #include <log4cxx/helpers/loglog.h>
 #include <log4cxx/helpers/transcoder.h>
+#include <log4cxx/private/datagramsocket_priv.h>
+#include <log4cxx/private/aprdatagramsocket.h>
 
 #include "apr_network_io.h"
 #include "apr_lib.h"
 
 using namespace log4cxx::helpers;
 
-struct DatagramSocket::DatagramSocketPriv
-{
-       DatagramSocketPriv()
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       DatagramSocketPriv(int localPort1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
-               : socket(0), address(), localAddress(), port(0), localPort(0)
-       {
-       }
-
-       /** The APR socket */
-       apr_socket_t* socket;
-
-       /** The memory pool for the socket */
-       Pool socketPool;
-
-       InetAddressPtr address;
-
-       InetAddressPtr localAddress;
-
-       int port;
-
-       /** The local port number to which this socket is connected. */
-       int localPort;
-};
-
 IMPLEMENT_LOG4CXX_OBJECT(DatagramSocket)
 
-DatagramSocket::DatagramSocket()
-       : m_priv(std::make_unique<DatagramSocketPriv>())
-{
-       create();
-}
-
-DatagramSocket::DatagramSocket(int localPort1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1))
-{
-       InetAddressPtr bindAddr = InetAddress::anyAddress();
-
-       create();
-       bind(localPort1, bindAddr);
-}
-
-DatagramSocket::DatagramSocket(int localPort1, InetAddressPtr localAddress1)
-       : m_priv(std::make_unique<DatagramSocketPriv>(localPort1, 
localAddress1))
-{
-       create();
-       bind(localPort1, localAddress1);
-}
+DatagramSocket::DatagramSocket(std::unique_ptr<DatagramSocketPriv> priv) :
+       m_priv(std::move(priv))
+{}
 
 DatagramSocket::~DatagramSocket()
 {
@@ -93,150 +44,9 @@ DatagramSocket::~DatagramSocket()
        }
 }
 
-/**  Binds a datagram socket to a local port and address.*/
-void DatagramSocket::bind(int localPort1, InetAddressPtr localAddress1)
-{
-       Pool addrPool;
-
-       // Create server socket address (including port number)
-       LOG4CXX_ENCODE_CHAR(hostAddr, localAddress1->getHostAddress());
-       apr_sockaddr_t* server_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
-                       localPort1, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(m_priv->socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-       m_priv->localPort = localPort1;
-       m_priv->localAddress = localAddress1;
-}
-
 /** Close the socket.*/
 void DatagramSocket::close()
 {
-       if (m_priv->socket != 0)
-       {
-               apr_status_t status = apr_socket_close(m_priv->socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               m_priv->socket = 0;
-               m_priv->localPort = 0;
-       }
-}
-
-void DatagramSocket::connect(InetAddressPtr address1, int port1)
-{
-
-       m_priv->address = address1;
-       m_priv->port = port1;
-
-       Pool addrPool;
-
-       // create socket address
-       LOG4CXX_ENCODE_CHAR(hostAddr, address1->getHostAddress());
-       apr_sockaddr_t* client_addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
-                       m_priv->port, 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status = apr_socket_connect(m_priv->socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-}
-
-/** Creates a datagram socket.*/
-void DatagramSocket::create()
-{
-       apr_socket_t* newSocket;
-       apr_status_t status =
-               apr_socket_create(&newSocket, APR_INET, SOCK_DGRAM,
-                       APR_PROTO_UDP, m_priv->socketPool.getAPRPool());
-       m_priv->socket = newSocket;
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-}
-
-/** Receive the datagram packet.*/
-void DatagramSocket::receive(DatagramPacketPtr& p)
-{
-       Pool addrPool;
-
-       // Create the address from which to receive the datagram packet
-       LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress());
-       apr_sockaddr_t* addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET,
-                       p->getPort(), 0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // receive the datagram packet
-       apr_size_t len = p->getLength();
-       status = apr_socket_recvfrom(addr, m_priv->socket, 0,
-                       (char*)p->getData(), &len);
-
-       if (status != APR_SUCCESS)
-       {
-               throw IOException(status);
-       }
-}
-
-/**  Sends a datagram packet.*/
-void DatagramSocket::send(DatagramPacketPtr& p)
-{
-       Pool addrPool;
-
-       // create the adress to which to send the datagram packet
-       LOG4CXX_ENCODE_CHAR(hostAddr, p->getAddress()->getHostAddress());
-       apr_sockaddr_t* addr;
-       apr_status_t status =
-               apr_sockaddr_info_get(&addr, hostAddr.c_str(), APR_INET, 
p->getPort(),
-                       0, addrPool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // send the datagram packet
-       apr_size_t len = p->getLength();
-       status = apr_socket_sendto(m_priv->socket, addr, 0,
-                       (char*)p->getData(), &len);
-
-       if (status != APR_SUCCESS)
-       {
-               throw IOException(status);
-       }
 }
 
 InetAddressPtr DatagramSocket::getInetAddress() const
@@ -264,12 +74,26 @@ bool DatagramSocket::isBound() const
        return m_priv->localPort != 0;
 }
 
-bool DatagramSocket::isClosed() const
-{
-       return m_priv->socket != 0;
-}
-
 bool DatagramSocket::isConnected() const
 {
        return m_priv->port != 0;
 }
+
+DatagramSocketUniquePtr DatagramSocket::create(){
+       return std::make_unique<APRDatagramSocket>();
+}
+
+DatagramSocketUniquePtr DatagramSocket::create(int localPort1){
+       std::unique_ptr<APRDatagramSocket> sock = 
std::make_unique<APRDatagramSocket>();
+       InetAddressPtr bindAddr = InetAddress::anyAddress();
+
+       sock->bind(localPort1, bindAddr);
+       return sock;
+}
+
+DatagramSocketUniquePtr DatagramSocket::create(int localPort1, InetAddressPtr 
localAddress1){
+       std::unique_ptr<APRDatagramSocket> sock = 
std::make_unique<APRDatagramSocket>();
+
+       sock->bind(localPort1, localAddress1);
+       return sock;
+}
diff --git a/src/main/cpp/serversocket.cpp b/src/main/cpp/serversocket.cpp
index 1cc9a3b9..cb81a141 100644
--- a/src/main/cpp/serversocket.cpp
+++ b/src/main/cpp/serversocket.cpp
@@ -16,154 +16,41 @@
  */
 
 #include <log4cxx/helpers/serversocket.h>
-#include <mutex>
-#include "apr_network_io.h"
-#include "apr_pools.h"
-#include "apr_poll.h"
+#include <log4cxx/private/serversocket_priv.h>
+#include <log4cxx/private/aprserversocket.h>
 
 using namespace log4cxx::helpers;
 
 /**  Creates a server socket on a specified port.
 */
-ServerSocket::ServerSocket(int port) : pool(), socket(0), timeout(0)
+ServerSocket::ServerSocket(std::unique_ptr<ServerSocketPrivate> priv) :
+       m_priv(std::move(priv))
 {
-       apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       status = apr_socket_opt_set(socket, APR_SO_NONBLOCK, 1);
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       // Create server socket address (including port number)
-       apr_sockaddr_t* server_addr;
-       status =
-               apr_sockaddr_info_get(&server_addr, NULL, APR_INET,
-                       port, 0, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // bind the socket to the address
-       status = apr_socket_bind(socket, server_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw BindException(status);
-       }
-
-
-       status = apr_socket_listen(socket, 50);
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
 }
 
-
 ServerSocket::~ServerSocket()
 {
+       close();
 }
 
 void ServerSocket::close()
 {
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket != 0)
-       {
-               apr_status_t status = apr_socket_close(socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               socket = 0;
-       }
-}
-
-/** Listens for a connection to be made to this socket and
-accepts it
-*/
-SocketPtr ServerSocket::accept()
-{
-       std::unique_lock<std::mutex> lock(mutex);
-
-       if (socket == 0)
-       {
-               throw IOException();
-       }
-
-       apr_pollfd_t poll;
-       poll.p = pool.getAPRPool();
-       poll.desc_type = APR_POLL_SOCKET;
-       poll.reqevents = APR_POLLIN;
-       poll.rtnevents = 0;
-       poll.desc.s = socket;
-       poll.client_data = NULL;
-
-       apr_int32_t signaled;
-       apr_interval_time_t to = timeout * 1000;
-       apr_status_t status = apr_poll(&poll, 1, &signaled, to);
-
-       if (APR_STATUS_IS_TIMEUP(status))
-       {
-               throw SocketTimeoutException();
-       }
-       else if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       apr_pool_t* newPool;
-       status = apr_pool_create(&newPool, 0);
-
-       if (status != APR_SUCCESS)
-       {
-               throw PoolException(status);
-       }
-
-       apr_socket_t* newSocket;
-       status = apr_socket_accept(&newSocket, socket, newPool);
-
-       if (status != APR_SUCCESS)
-       {
-               apr_pool_destroy(newPool);
-               throw SocketException(status);
-       }
-
-       status = apr_socket_opt_set(newSocket, APR_SO_NONBLOCK, 0);
-
-       if (status != APR_SUCCESS)
-       {
-               apr_pool_destroy(newPool);
-               throw SocketException(status);
-       }
-
-       return SocketPtr(new Socket(newSocket, newPool));
 }
 
 /** Retrive setting for SO_TIMEOUT.
 */
 int ServerSocket::getSoTimeout() const
 {
-       return timeout;
+       return m_priv->timeout;
 }
 
 /** Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds.
 */
 void ServerSocket::setSoTimeout(int newVal)
 {
-       timeout = newVal;
+       m_priv->timeout = newVal;
+}
+
+ServerSocketUniquePtr ServerSocket::create(int port){
+       return std::make_unique<APRServerSocket>(port);
 }
diff --git a/src/main/cpp/socket.cpp b/src/main/cpp/socket.cpp
index cdd8724f..d27e4924 100644
--- a/src/main/cpp/socket.cpp
+++ b/src/main/cpp/socket.cpp
@@ -17,145 +17,36 @@
 #include <log4cxx/helpers/socket.h>
 #include <log4cxx/helpers/bytebuffer.h>
 #include <log4cxx/helpers/transcoder.h>
-#include "apr_network_io.h"
-#include "apr_signal.h"
 
+#include <log4cxx/private/socket_priv.h>
+#include <log4cxx/private/aprsocket.h>
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT(Socket)
 
-/** Creates a stream socket and connects it to the specified port
-number at the specified IP address.
-*/
-Socket::Socket(InetAddressPtr& addr, int prt) : pool(), socket(0), 
address(addr), port(prt)
-{
-       apr_status_t status =
-               apr_socket_create(&socket, APR_INET, SOCK_STREAM,
-                       APR_PROTO_TCP, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw SocketException(status);
-       }
-
-       LOG4CXX_ENCODE_CHAR(host, addr->getHostAddress());
-
-       // create socket address (including port)
-       apr_sockaddr_t* client_addr;
-       status =
-               apr_sockaddr_info_get(&client_addr, host.c_str(), APR_INET,
-                       prt, 0, pool.getAPRPool());
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-
-       // connect the socket
-       status =  apr_socket_connect(socket, client_addr);
-
-       if (status != APR_SUCCESS)
-       {
-               throw ConnectException(status);
-       }
-}
+Socket::Socket(std::unique_ptr<Socket::SocketPrivate> priv) :
+       m_priv(std::move(priv)){
 
-Socket::Socket(apr_socket_t* s, apr_pool_t* p) :
-       pool(p, true), socket(s)
-{
-       apr_sockaddr_t* sa;
-       apr_status_t status = apr_socket_addr_get(&sa, APR_REMOTE, s);
-
-       if (status == APR_SUCCESS)
-       {
-               port = sa->port;
-               LogString remotename;
-               LogString remoteip;
-
-               if (sa->hostname != NULL)
-               {
-                       Transcoder::decode(sa->hostname, remotename);
-               }
-
-               char* buf = 0;
-               status = apr_sockaddr_ip_get(&buf, sa);
-
-               if (status == APR_SUCCESS)
-               {
-                       Transcoder::decode(buf, remoteip);
-               }
-
-               address = InetAddressPtr(new InetAddress(remotename, remoteip));
-       }
 }
 
 Socket::~Socket()
 {
 }
 
-size_t Socket::write(ByteBuffer& buf)
-{
-       if (socket == 0)
-       {
-               throw ClosedChannelException();
-       }
-
-       int totalWritten = 0;
-
-       while (buf.remaining() > 0)
-       {
-               apr_size_t written = buf.remaining();
-
-               // while writing to the socket, we need to ignore the SIGPIPE
-               // signal. Otherwise, when the client has closed the connection,
-               // the send() function would not return an error but call the
-               // SIGPIPE handler.
-#if APR_HAVE_SIGACTION
-               apr_sigfunc_t* old = apr_signal(SIGPIPE, SIG_IGN);
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
-               apr_signal(SIGPIPE, old);
-#else
-               apr_status_t status = apr_socket_send(socket, buf.current(), 
&written);
-#endif
-
-               buf.position(buf.position() + written);
-               totalWritten += written;
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-       }
-
-       return totalWritten;
-}
-
-
-void Socket::close()
-{
-       if (socket != 0)
-       {
-               apr_status_t status = apr_socket_close(socket);
-
-               if (status != APR_SUCCESS)
-               {
-                       throw SocketException(status);
-               }
-
-               socket = 0;
-       }
-}
-
 InetAddressPtr Socket::getInetAddress() const
 {
-       return address;
+       return m_priv->address;
 }
 
 int Socket::getPort() const
 {
-       return port;
+       return m_priv->port;
+}
+
+SocketUniquePtr Socket::create(InetAddressPtr& address, int port){
+       return std::make_unique<APRSocket>(address, port);
 }
 
 
diff --git a/src/main/cpp/socketappenderskeleton.cpp 
b/src/main/cpp/socketappenderskeleton.cpp
index de79bd8a..03d87cc1 100644
--- a/src/main/cpp/socketappenderskeleton.cpp
+++ b/src/main/cpp/socketappenderskeleton.cpp
@@ -89,7 +89,7 @@ void SocketAppenderSkeleton::connect(Pool& p)
 
                try
                {
-                       SocketPtr socket(new Socket(_priv->address, 
_priv->port));
+                       SocketPtr socket = Socket::create(_priv->address, 
_priv->port);
                        setSocket(socket, p);
                }
                catch (SocketException& e)
@@ -157,7 +157,7 @@ void SocketAppenderSkeleton::monitor()
                        {
                                LogLog::debug(LogString(LOG4CXX_STR("Attempting 
connection to "))
                                        + _priv->address->getHostName());
-                               socket = SocketPtr(new Socket(_priv->address, 
_priv->port));
+                               socket = Socket::create(_priv->address, 
_priv->port);
                                Pool p;
                                setSocket(socket, p);
                                LogLog::debug(LOG4CXX_STR("Connection 
established. Exiting connector thread."));
diff --git a/src/main/cpp/sockethubappender.cpp 
b/src/main/cpp/sockethubappender.cpp
index 86613bbe..ca84f168 100644
--- a/src/main/cpp/sockethubappender.cpp
+++ b/src/main/cpp/sockethubappender.cpp
@@ -201,17 +201,16 @@ void SocketHubAppender::startServer()
 
 void SocketHubAppender::monitor()
 {
-       ServerSocket* serverSocket = 0;
+       ServerSocketUniquePtr serverSocket = 0;
 
        try
        {
-               serverSocket = new ServerSocket(_priv->port);
+               serverSocket = ServerSocket::create(_priv->port);
                serverSocket->setSoTimeout(1000);
        }
        catch (SocketException& e)
        {
                LogLog::error(LOG4CXX_STR("exception setting timeout, shutting 
down server socket."), e);
-               delete serverSocket;
                return;
        }
 
@@ -266,8 +265,6 @@ void SocketHubAppender::monitor()
 
                stopRunning = (stopRunning || _priv->closed);
        }
-
-       delete serverSocket;
 }
 
 void SocketHubAppender::setPort(int port1)
diff --git a/src/main/cpp/syslogwriter.cpp b/src/main/cpp/syslogwriter.cpp
index ad8c92e8..dde4ffa8 100644
--- a/src/main/cpp/syslogwriter.cpp
+++ b/src/main/cpp/syslogwriter.cpp
@@ -54,7 +54,7 @@ SyslogWriter::SyslogWriter(const LogString& syslogHost1, int 
syslogHostPort1)
 
        try
        {
-               m_priv->ds = DatagramSocketPtr(new DatagramSocket());
+               m_priv->ds = DatagramSocket::create();
        }
        catch (SocketException& e)
        {
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index 9a2e8ee5..0c72a809 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -75,7 +75,7 @@ void TelnetAppender::activateOptions(Pool& /* p */)
 {
        if (_priv->serverSocket == NULL)
        {
-               _priv->serverSocket = 
std::make_unique<ServerSocket>(_priv->port);
+               _priv->serverSocket = ServerSocket::create(_priv->port);
                _priv->serverSocket->setSoTimeout(1000);
        }
 
diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt
index e31443fb..d21ecdac 100644
--- a/src/main/include/CMakeLists.txt
+++ b/src/main/include/CMakeLists.txt
@@ -58,6 +58,12 @@ foreach(varName WCHAR_T  UNICHAR  CFSTRING )
   endif()
 endforeach()
 
+option(LOG4CXX_NETWORKING_SUPPORT "Support logging over a network socket" ON)
+if(LOG4CXX_NETWORKING_SUPPORT)
+    set(NETWORKING_SUPPORT 1)
+else()
+    set(NETWORKING_SUPPORT 0)
+endif()
 
 # Configure log4cxx_private.h
 set(LOG4CXX_CHARSET "locale" CACHE STRING "LogString characters, choice of 
locale (default), utf-8, ISO-8859-1, US-ASCII, EBCDIC")
diff --git a/src/main/include/log4cxx/helpers/datagramsocket.h 
b/src/main/include/log4cxx/helpers/datagramsocket.h
index 04df8edb..cbfd29d2 100644
--- a/src/main/include/log4cxx/helpers/datagramsocket.h
+++ b/src/main/include/log4cxx/helpers/datagramsocket.h
@@ -27,42 +27,38 @@ namespace log4cxx
 {
 namespace helpers
 {
+
+class DatagramSocket;
+LOG4CXX_PTR_DEF(DatagramSocket);
+LOG4CXX_UNIQUE_PTR_DEF(DatagramSocket);
+
 /** This class represents a socket for sending and receiving
 datagram packets.*/
 class LOG4CXX_EXPORT DatagramSocket : public helpers::Object
 {
+       protected:
+               struct DatagramSocketPriv;
+               std::unique_ptr<DatagramSocketPriv> m_priv;
+
+               DatagramSocket(std::unique_ptr<DatagramSocketPriv> priv);
+
        public:
                DECLARE_ABSTRACT_LOG4CXX_OBJECT(DatagramSocket)
                BEGIN_LOG4CXX_CAST_MAP()
                LOG4CXX_CAST_ENTRY(DatagramSocket)
                END_LOG4CXX_CAST_MAP()
 
-               /** Constructs a datagram socket and binds it to any available 
port
-               on the local host machine.*/
-               DatagramSocket();
-
-               /** Constructs a datagram socket and binds it to the specified
-               port on the local host machine. */
-               DatagramSocket(int port);
-
-               /**  Creates a datagram socket, bound to the specified local
-               address. */
-               DatagramSocket(int port, InetAddressPtr laddr);
-
                /** ensure the socket is closed. */
-               ~DatagramSocket();
+               virtual ~DatagramSocket();
 
                /**  Binds a datagram socket to a local port and address.*/
-               void bind(int lport, InetAddressPtr laddress);
-
-               /** Creates a datagram socket.*/
-               void create();
+               virtual void bind(int lport, InetAddressPtr laddress) = 0;
 
                /** Closes this datagram socket */
-               void close();
+               virtual void close();
 
                /** Connects the socket to a remote address for this socket. */
-               void connect(InetAddressPtr address, int port);
+               virtual void connect(InetAddressPtr address, int port) = 0;
 
                /** Returns the address to which this socket is connected. */
                InetAddressPtr getInetAddress() const;
@@ -81,26 +77,35 @@ class LOG4CXX_EXPORT DatagramSocket : public helpers::Object
                bool isBound() const;
 
                /** Returns wether the socket is closed or not. */
-               bool isClosed() const;
+               virtual bool isClosed() const = 0;
 
                /** Returns the connection state of the socket. */
                bool isConnected() const;
 
                /**  Receives a datagram packet from this socket. */
-               void receive(DatagramPacketPtr& p);
+               virtual void receive(DatagramPacketPtr& p) = 0;
 
                /** Sends a datagram packet from this socket. */
-               void  send(DatagramPacketPtr& p);
+               virtual void  send(DatagramPacketPtr& p) = 0;
+
+               /** Constructs a datagram socket and binds it to any available 
port
+               on the local host machine.*/
+               static DatagramSocketUniquePtr create();
+
+               /** Constructs a datagram socket and binds it to the specified
+               port on the local host machine. */
+               static DatagramSocketUniquePtr create(int port);
+
+               /**  Creates a datagram socket, bound to the specified local
+               address. */
+               static DatagramSocketUniquePtr create(int port, InetAddressPtr 
laddr);
 
        private:
                DatagramSocket(const DatagramSocket&);
                DatagramSocket& operator=(const DatagramSocket&);
 
-               struct DatagramSocketPriv;
-               std::unique_ptr<DatagramSocketPriv> m_priv;
-
 };
-LOG4CXX_PTR_DEF(DatagramSocket);
+
 }  // namespace helpers
 } // namespace log4cxx
 
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/helpers/serversocket.h
index 7da75b96..c1847a78 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/helpers/serversocket.h
@@ -25,23 +25,29 @@ namespace log4cxx
 {
 namespace helpers
 {
+
+class ServerSocket;
+LOG4CXX_PTR_DEF(ServerSocket);
+LOG4CXX_UNIQUE_PTR_DEF(ServerSocket);
+
 class LOG4CXX_EXPORT ServerSocket
 {
+       protected:
+               struct ServerSocketPrivate;
+               ServerSocket(std::unique_ptr<ServerSocketPrivate> priv);
+
        public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
 
                virtual ~ServerSocket();
 
                /** Listens for a connection to be made to this socket and
                accepts it
                */
-               SocketPtr accept();
+               virtual SocketPtr accept() = 0;
 
                /** Closes this socket.
                */
-               void close();
+               virtual void close();
 
                /** Retrive setting for SO_TIMEOUT.
                */
@@ -51,11 +57,10 @@ class LOG4CXX_EXPORT ServerSocket
                */
                void setSoTimeout(int timeout);
 
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+               static ServerSocketUniquePtr create(int port);
+
+       protected:
+               std::unique_ptr<ServerSocketPrivate> m_priv;
 
 };
 }  // namespace helpers
diff --git a/src/main/include/log4cxx/helpers/socket.h 
b/src/main/include/log4cxx/helpers/socket.h
index 9284490b..fd7cadd4 100644
--- a/src/main/include/log4cxx/helpers/socket.h
+++ b/src/main/include/log4cxx/helpers/socket.h
@@ -18,11 +18,6 @@
 #ifndef _LOG4CXX_HELPERS_SOCKET_H
 #define _LOG4CXX_HELPERS_SOCKET_H
 
-extern "C" {
-       struct apr_socket_t;
-}
-
-
 #include <log4cxx/helpers/inetaddress.h>
 #include <log4cxx/helpers/pool.h>
 
@@ -32,6 +27,11 @@ namespace log4cxx
 namespace helpers
 {
 class ByteBuffer;
+
+class Socket;
+LOG4CXX_PTR_DEF(Socket);
+LOG4CXX_UNIQUE_PTR_DEF(Socket);
+
 /**
 <p>This class implements client sockets (also called just "sockets"). A socket
 is an endpoint for communication between two machines.
@@ -42,48 +42,40 @@ local firewall.
 */
 class LOG4CXX_EXPORT Socket : public helpers::Object
 {
+       protected:
+               struct SocketPrivate;
+
+               Socket(std::unique_ptr<SocketPrivate>);
+
        public:
                DECLARE_ABSTRACT_LOG4CXX_OBJECT(Socket)
                BEGIN_LOG4CXX_CAST_MAP()
                LOG4CXX_CAST_ENTRY(Socket)
                END_LOG4CXX_CAST_MAP()
 
-               /** Creates a stream socket and connects it to the specified 
port
-               number at the specified IP address.
-               */
-               Socket(InetAddressPtr& address, int port);
-               Socket(apr_socket_t* socket, apr_pool_t* pool);
-               ~Socket();
+               virtual ~Socket();
 
-               size_t write(ByteBuffer&);
+               virtual size_t write(ByteBuffer&) = 0;
 
                /** Closes this socket. */
-               void close();
+               virtual void close() = 0;
 
                /** Returns the value of this socket's address field. */
                InetAddressPtr getInetAddress() const;
 
                /** Returns the value of this socket's port field. */
                int getPort() const;
+
+               static SocketUniquePtr create(InetAddressPtr& address, int 
port);
+
        private:
                Socket(const Socket&);
                Socket& operator=(const Socket&);
 
-               Pool pool;
-
-               apr_socket_t* socket;
-
-
-               /** The IP address of the remote end of this socket. */
-               InetAddressPtr address;
-
-               /** The port number on the remote host to which
-               this socket is connected. */
-               int port;
+       protected:
+               std::unique_ptr<SocketPrivate> m_priv;
 };
 
-LOG4CXX_PTR_DEF(Socket);
-
 } // namespace helpers
 } // namespace log4cxx
 
diff --git a/src/main/include/log4cxx/log4cxx.h.in 
b/src/main/include/log4cxx/log4cxx.h.in
index c97869cc..e350d831 100644
--- a/src/main/include/log4cxx/log4cxx.h.in
+++ b/src/main/include/log4cxx/log4cxx.h.in
@@ -48,7 +48,7 @@
 #define LOG4CXX_WCHAR_T_API @WCHAR_T_API@
 #define LOG4CXX_UNICHAR_API @UNICHAR_API@
 #define LOG4CXX_CFSTRING_API @CFSTRING_API@
-
+#define LOG4CXX_HAS_NETWORKING @NETWORKING_SUPPORT@
 
 typedef long long log4cxx_int64_t;
 #define LOG4CXX_USE_GLOBAL_SCOPE_TEMPLATE 0
@@ -62,6 +62,7 @@ typedef unsigned int log4cxx_uint32_t;
 
 #define LOG4CXX_PTR_DEF(T) typedef std::shared_ptr<T> T##Ptr;\
        typedef std::weak_ptr<T> T##WeakPtr
+#define LOG4CXX_UNIQUE_PTR_DEF(T) typedef std::unique_ptr<T> T##UniquePtr;
 #define LOG4CXX_LIST_DEF(N, T) typedef std::vector<T> N
 
 #if _WIN32
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/aprdatagramsocket.h
similarity index 51%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/aprdatagramsocket.h
index 7da75b96..0f75cd0a 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/aprdatagramsocket.h
@@ -14,51 +14,46 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#ifndef LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H
+#define LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
-
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/datagramsocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
 
-               virtual ~ServerSocket();
+class APRDatagramSocket : public DatagramSocket {
+    private:
+        struct APRDatagramSocketPriv;
+
+    public:
+       APRDatagramSocket();
+
+       APRDatagramSocket(int port);
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
+       APRDatagramSocket(int port, InetAddressPtr laddr);
 
-               /** Closes this socket.
-               */
-               void close();
+       virtual void bind(int lport, InetAddressPtr laddress);
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
+       virtual void close();
 
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+       virtual bool isClosed() const;
 
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+       /**  Receives a datagram packet from this socket. */
+       virtual void receive(DatagramPacketPtr& p);
 
+       /** Sends a datagram packet from this socket. */
+       virtual void  send(DatagramPacketPtr& p);
+
+       virtual void connect(InetAddressPtr address, int port);
+
+    private:
+       void init();
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRDATAGRAM_SOCKET_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/aprserversocket.h
similarity index 52%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/aprserversocket.h
index 7da75b96..b05aba91 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/aprserversocket.h
@@ -15,50 +15,33 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_APRSERVERSOCKET_H
+#define LOG4CXX_HELPERS_APRSERVERSOCKET_H
 
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/serversocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
+/**
+ * A ServerSocket that uses APR as the network implementation
+ */
+class LOG4CXX_EXPORT APRServerSocket : public helpers::ServerSocket
+{
+        public:
+            APRServerSocket(int port);
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
+           void close();
 
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+           SocketPtr accept();
 
        private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
-
+               struct APRServerSocketPriv;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRSERVERSOCKET_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/aprsocket.h
similarity index 55%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/aprsocket.h
index 7da75b96..5869a756 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/aprsocket.h
@@ -15,50 +15,37 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_APRSOCKET_H
+#define LOG4CXX_HELPERS_APRSOCKET_H
 
 #include <log4cxx/helpers/socket.h>
-#include <mutex>
+
+struct apr_socket_t;
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
+
+class LOG4CXX_EXPORT APRSocket : public helpers::Socket
 {
        public:
-               /**  Creates a server socket on a specified port.
+               /** Creates a stream socket and connects it to the specified 
port
+               number at the specified IP address.
                */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
+               APRSocket(InetAddressPtr& address, int port);
+               APRSocket(apr_socket_t*, apr_pool_t* pool);
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
+               virtual size_t write(ByteBuffer&);
 
-               /** Closes this socket.
-               */
-               void close();
-
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+               /** Closes this socket. */
+               virtual void close();
 
        private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
-
+               struct APRSocketPriv;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_APRSOCKET_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/datagramsocket_priv.h
similarity index 51%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/datagramsocket_priv.h
index 7da75b96..1b4b4bb9 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/datagramsocket_priv.h
@@ -15,50 +15,44 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_SOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SOCKET_PRIV_H
 
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/datagramsocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
 
-               virtual ~ServerSocket();
+struct DatagramSocket::DatagramSocketPriv
+{
+        DatagramSocketPriv()
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
 
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
+       DatagramSocketPriv(int localPort1)
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
 
-               /** Closes this socket.
-               */
-               void close();
+       DatagramSocketPriv(int localPort1, InetAddressPtr localAddress1)
+               : address(), localAddress(), port(0), localPort(0)
+       {
+       }
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
+       InetAddressPtr address;
 
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
+       InetAddressPtr localAddress;
 
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+       int port;
 
+       /** The local port number to which this socket is connected. */
+       int localPort;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SOCKET_PRIV_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/serversocket_priv.h
similarity index 51%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/serversocket_priv.h
index 7da75b96..0d3b021d 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/serversocket_priv.h
@@ -15,50 +15,24 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H
 
-#include <log4cxx/helpers/socket.h>
-#include <mutex>
+#include <log4cxx/helpers/serversocket.h>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
-
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
-
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+struct ServerSocket::ServerSocketPrivate{
+    ServerSocketPrivate() :
+        timeout(0){}
 
+    int timeout;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SERVERSOCKET_PRIV_H */
diff --git a/src/main/include/log4cxx/helpers/serversocket.h 
b/src/main/include/log4cxx/private/socket_priv.h
similarity index 53%
copy from src/main/include/log4cxx/helpers/serversocket.h
copy to src/main/include/log4cxx/private/socket_priv.h
index 7da75b96..fcc09bf7 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/private/socket_priv.h
@@ -15,50 +15,26 @@
  * limitations under the License.
  */
 
-#ifndef _LOG4CXX_HELPERS_SERVER_SOCKET_H
-#define _LOG4CXX_HELPERS_SERVER_SOCKET_H
+#ifndef LOG4CXX_HELPERS_SOCKET_PRIV_H
+#define LOG4CXX_HELPERS_SOCKET_PRIV_H
 
 #include <log4cxx/helpers/socket.h>
-#include <mutex>
 
 namespace log4cxx
 {
 namespace helpers
 {
-class LOG4CXX_EXPORT ServerSocket
-{
-       public:
-               /**  Creates a server socket on a specified port.
-               */
-               ServerSocket(int port);
-
-               virtual ~ServerSocket();
-
-               /** Listens for a connection to be made to this socket and
-               accepts it
-               */
-               SocketPtr accept();
-
-               /** Closes this socket.
-               */
-               void close();
 
-               /** Retrive setting for SO_TIMEOUT.
-               */
-               int getSoTimeout() const;
-
-               /** Enable/disable SO_TIMEOUT with the specified timeout, in 
milliseconds.
-               */
-               void setSoTimeout(int timeout);
-
-       private:
-               Pool pool;
-               std::mutex mutex;
-               apr_socket_t* socket;
-               int timeout;
+struct Socket::SocketPrivate{
+    /** The IP address of the remote end of this socket. */
+    InetAddressPtr address;
 
+    /** The port number on the remote host to which
+    this socket is connected. */
+    int port;
 };
-}  // namespace helpers
-} // namespace log4cxx
 
-#endif //_LOG4CXX_HELPERS_SERVER_SOCKET_H
+}
+}
+
+#endif /* LOG4CXX_HELPERS_SOCKET_PRIV_H */
diff --git a/src/test/cpp/helpers/CMakeLists.txt 
b/src/test/cpp/helpers/CMakeLists.txt
index e8921c81..fe07d973 100644
--- a/src/test/cpp/helpers/CMakeLists.txt
+++ b/src/test/cpp/helpers/CMakeLists.txt
@@ -32,11 +32,15 @@ set(HELPER_TESTS
     relativetimedateformattestcase
     stringhelpertestcase
     stringtokenizertestcase
-    syslogwritertest
     timezonetestcase
     transcodertestcase
     threadutilitytestcase
 )
+
+if(LOG4CXX_NETWORKING_SUPPORT)
+    list(APPEND HELPER_TESTS syslogwritertest)
+endif()
+
 foreach(fileName IN LISTS HELPER_TESTS)
     add_executable(${fileName} "${fileName}.cpp")
     target_compile_definitions(${fileName} PRIVATE ${APR_COMPILE_DEFINITIONS} 
${APR_UTIL_COMPILE_DEFINITIONS} )
diff --git a/src/test/cpp/net/CMakeLists.txt b/src/test/cpp/net/CMakeLists.txt
index 32d3053f..d692f5ef 100644
--- a/src/test/cpp/net/CMakeLists.txt
+++ b/src/test/cpp/net/CMakeLists.txt
@@ -16,12 +16,17 @@
 #
 
 # Tests defined in this directory
-set(NET_TESTS
-    sockethubappendertestcase
-    syslogappendertestcase
-    telnetappendertestcase
-    xmlsocketappendertestcase
-)
+if(LOG4CXX_NETWORKING_SUPPORT)
+    set(NET_TESTS
+       sockethubappendertestcase
+       syslogappendertestcase
+       telnetappendertestcase
+       xmlsocketappendertestcase
+    )
+else()
+    set(NET_TESTS "")
+endif()
+
 if(HAS_LIBESMPT)
     list(APPEND NET_TESTS smtpappendertestcase)
 endif(HAS_LIBESMPT)

Reply via email to