Author: afester
Date: Tue May  2 11:59:46 2006
New Revision: 399015

URL: http://svn.apache.org/viewcvs?rev=399015&view=rev
Log:
LOGCXX-64: ported datagramsocket to APR network IO

Modified:
    logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h
    logging/log4cxx/trunk/src/datagramsocket.cpp

Modified: logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h?rev=399015&r1=399014&r2=399015&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/datagramsocket.h Tue May  2 
11:59:46 2006
@@ -20,6 +20,10 @@
 #include <log4cxx/helpers/objectimpl.h>
 #include <log4cxx/helpers/objectptr.h>
 #include <log4cxx/helpers/inetaddress.h>
+#include <log4cxx/helpers/pool.h>
+
+
+extern "C" { struct apr_socket_t; }
 
 namespace log4cxx
 {
@@ -91,7 +95,7 @@
 
                         /** Returns wether the socket is closed or not. */
                         inline bool isClosed() const
-                                { return fd != 0; }
+                                { return socket != 0; }
 
                         /** Returns the connection state of the socket. */
                         inline bool isConnected() const
@@ -103,12 +107,17 @@
                         /** Sends a datagram packet from this socket. */
                         void  send(DatagramPacketPtr& p);
 
-                protected:
-                        /** The file descriptor object for this socket. */
-                        int fd;
+                private:
+                        /** The APR socket */
+                        apr_socket_t *socket;
+
+                        /** The memory pool for the socket */
+                        Pool socketPool;
 
                         InetAddress address;
+
                         InetAddress localAddress;
+
                         int port;
 
                         /** The local port number to which this socket is 
connected. */

Modified: logging/log4cxx/trunk/src/datagramsocket.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/datagramsocket.cpp?rev=399015&r1=399014&r2=399015&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/datagramsocket.cpp (original)
+++ logging/log4cxx/trunk/src/datagramsocket.cpp Tue May  2 11:59:46 2006
@@ -14,38 +14,27 @@
  * limitations under the License.
  */
 
-
-#if defined(_WIN32)
-#include <windows.h>
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include <netdb.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#endif
-
 #include <log4cxx/helpers/datagrampacket.h>
 #include <log4cxx/helpers/datagramsocket.h>
 #include <log4cxx/helpers/loglog.h>
+#include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/helpers/socketimpl.h>
 
+#include "apr_network_io.h"
+#include "apr_lib.h"
+
 using namespace log4cxx::helpers;
 
 IMPLEMENT_LOG4CXX_OBJECT(DatagramSocket);
 
 DatagramSocket::DatagramSocket()
- : fd(0), address(), localAddress(), port(0), localPort(0)
+ : socket(0), address(), localAddress(), port(0), localPort(0)
 {
    create();
 }
 
 DatagramSocket::DatagramSocket(int localPort)
- : fd(0), address(), localAddress(), port(0), localPort(0)
+ : socket(0), address(), localAddress(), port(0), localPort(0)
 {
    InetAddress bindAddr;
    bindAddr.address = INADDR_ANY;
@@ -55,7 +44,7 @@
 }
 
 DatagramSocket::DatagramSocket(int localPort, InetAddress localAddress)
- : fd(0), address(), localAddress(), port(0), localPort(0)
+ : socket(0), address(), localAddress(), port(0), localPort(0)
 {
    create();
    bind(localPort, localAddress);
@@ -75,16 +64,22 @@
 /**  Binds a datagram socket to a local port and address.*/
 void DatagramSocket::bind(int localPort, InetAddress localAddress)
 {
-   struct sockaddr_in server_addr;
-   int server_len = sizeof(server_addr);
+   Pool addrPool;
 
-   server_addr.sin_family = AF_INET;
-   server_addr.sin_addr.s_addr = htonl(localAddress.address);
-   server_addr.sin_port = htons(localPort);
-
-   if (::bind(fd, (sockaddr *)&server_addr, server_len) == -1)
-   {
-      throw BindException();
+   // Create server socket address
+   LOG4CXX_ENCODE_CHAR(hostAddr, localAddress.getHostAddress());
+   apr_sockaddr_t *server_addr;
+   apr_status_t status = 
+       apr_sockaddr_info_get(&server_addr, hostAddr.c_str(), APR_INET,
+                             localPort, 0, (apr_pool_t*) 
addrPool.getAPRPool());
+   if (status != APR_SUCCESS) {
+     throw BindException(status);
+   }
+
+   // bind the socket to the address
+   status = apr_socket_bind(socket, server_addr);
+   if (status != APR_SUCCESS) {
+     throw BindException(status);
    }
 
    this->localPort = localPort;
@@ -94,97 +89,100 @@
 /** Close the socket.*/
 void DatagramSocket::close()
 {
-   if (fd != 0)
-   {
+   if (socket != 0) {
       LOGLOG_DEBUG(LOG4CXX_STR("closing socket"));
-#if defined(WIN32) || defined(_WIN32)
-      if (::closesocket(fd) == -1)
-#else
-      if (::close(fd) == -1)
-#endif
-      {
-         throw SocketException();
+      apr_status_t status = apr_socket_close(socket);
+      if (status != APR_SUCCESS) {
+        throw SocketException(status);
       }
 
-      fd = 0;
+      socket = 0;
       localPort = 0;
    }
 }
 
 void DatagramSocket::connect(InetAddress address, int port)
 {
-   sockaddr_in client_addr;
-   int client_len = sizeof(client_addr);
-
-   client_addr.sin_family = AF_INET;
-   client_addr.sin_addr.s_addr = htonl(address.address);
-   client_addr.sin_port = htons(port);
-
-   if (::connect(fd, (sockaddr *)&client_addr, client_len) == -1)
-   {
-      throw ConnectException();
-   }
 
    this->address = address;
    this->port = port;
+
+   Pool addrPool;
+
+   // create socket address
+   LOG4CXX_ENCODE_CHAR(hostAddr, address.getHostAddress());
+   apr_sockaddr_t *client_addr;
+   apr_status_t status = 
+       apr_sockaddr_info_get(&client_addr, hostAddr.c_str(), APR_INET,
+                             port, 0, (apr_pool_t*) addrPool.getAPRPool());
+   if (status != APR_SUCCESS) {
+     throw ConnectException(status);
+   }
+
+   // connect the socket
+   status = apr_socket_connect(socket, client_addr);
+   if (status != APR_SUCCESS) {
+     throw ConnectException();
+   }
 }
 
 /** Creates a datagram socket.*/
 void DatagramSocket::create()
 {
-   if ((fd = ::socket(AF_INET, SOCK_DGRAM, 0)) == -1)
-   {
-      throw SocketException();
-   }
+  apr_socket_t* newSocket;
+  apr_status_t status =
+    apr_socket_create(&newSocket, APR_INET, SOCK_DGRAM, 
+                      APR_PROTO_UDP, (apr_pool_t*) socketPool.getAPRPool());
+  socket = newSocket;
+  if (status != APR_SUCCESS) {
+    throw SocketException(status);
+  }
 }
 
 /** Receive the datagram packet.*/
 void DatagramSocket::receive(DatagramPacketPtr& p)
 {
-   sockaddr_in addr;
-   int addr_len = sizeof(addr);
+   Pool addrPool;
 
-   addr.sin_family = AF_INET;
-   addr.sin_addr.s_addr = htonl(p->getAddress().address);
-   addr.sin_port = htons(p->getPort());
-
-#if defined(WIN32) || defined(_WIN32)
-   if (::recvfrom(fd, (char *)p->getData(), p->getLength(), 0,
-      (sockaddr *)&addr, &addr_len) == -1)
-#elif defined(__hpux)
-   if (::recvfrom(fd, p->getData(), p->getLength(), 0,
-      (sockaddr *)&addr, &addr_len) == -1)
-#else
-   if (::recvfrom(fd, p->getData(), p->getLength(), 0,
-      (sockaddr *)&addr, (socklen_t *)&addr_len) == -1)
-#endif
-   {
-      throw IOException();
+   // 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, (apr_pool_t*) 
addrPool.getAPRPool());
+   if (status != APR_SUCCESS) {
+     throw SocketException(status);
+   }
+
+   // receive the datagram packet
+   apr_size_t len = p->getLength();
+   status = apr_socket_recvfrom(addr, socket, 0,
+                                (char *)p->getData(), &len);
+   if (status != APR_SUCCESS) {
+     throw IOException(status);
    }
-
 }
 
 /**  Sends a datagram packet.*/
 void DatagramSocket::send(DatagramPacketPtr& p)
 {
-   sockaddr_in addr;
-   int addr_len = sizeof(addr);
+   Pool addrPool;
 
-   addr.sin_family = AF_INET;
-   addr.sin_addr.s_addr = htonl(p->getAddress().address);
-   addr.sin_port = htons(p->getPort());
-
-#if defined(WIN32) || defined(_WIN32)
-   if (::sendto(fd, (const char *)p->getData(), p->getLength(), 0,
-      (sockaddr *)&addr, addr_len) == -1)
-#else
-   if (::sendto(fd, p->getData(), p->getLength(), 0,
-      (sockaddr *)&addr, addr_len) == -1)
-#endif
-   {
-      throw IOException();
+   // 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, (apr_pool_t*) addrPool.getAPRPool());
+   if (status != APR_SUCCESS) {
+     throw SocketException(status);
+   }
+
+   // send the datagram packet
+   apr_size_t len = p->getLength();
+   status = apr_socket_sendto(socket, addr, 0,
+                              (char *)p->getData(), &len);
+   if (status != APR_SUCCESS) {
+     throw IOException(status);
    }
 }
-
-
-


Reply via email to