src/Network/Socket.cc
changeset 381 9b35bc329d23
parent 380 d193dd1d8a7e
child 385 e56af22c04dd
--- a/src/Network/Socket.cc	Tue Dec 16 23:21:26 2008 +0000
+++ b/src/Network/Socket.cc	Wed Dec 17 00:40:22 2008 +0000
@@ -79,7 +79,7 @@
     reset();
 }
 
-void NetworkSocket::bind (const NetworkAddress &addr) {
+void NetworkSocket::bind (const NetworkEndpoint &addr) {
     // get our addrinfo
     addrinfo *r, *results = addr.get_addrinfo(type.family, type.socktype, type.protocol, AI_PASSIVE);
     
@@ -110,7 +110,7 @@
     }
    
     // release our addrinfo
-    freeaddrinfo(results);
+    addr.free_addrinfo(results);
 
     // if we failed to bind, r is a NULL pointer
     if (r == NULL)
@@ -127,27 +127,31 @@
 }
         
 NetworkAddress NetworkSocket::get_local_address (void) {
-    sockaddr_storage addr;
-    socklen_t addrlen = sizeof(addr);
+    NetworkAddress addr;
 
     // do getsockname()
-    if (::getsockname(fd, (sockaddr *) &addr, &addrlen))
+    if (::getsockname(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
         throw NetworkSocketErrno(*this, "getsockname");
 
+    // update
+    addr.update();
+
     // return addr
-    return NetworkAddress((sockaddr *) &addr, addrlen);
+    return addr;
 }
 
 NetworkAddress NetworkSocket::get_remote_address (void) {
-    sockaddr_storage addr;
-    socklen_t addrlen = sizeof(addr);
+    NetworkAddress addr;
 
     // do getpeername()
-    if (::getpeername(fd, (sockaddr *) &addr, &addrlen))
+    if (::getpeername(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
         throw NetworkSocketErrno(*this, "getpeername");
 
+    // update
+    addr.update();
+
     // return addr
-    return NetworkAddress((sockaddr *) &addr, addrlen);
+    return addr;
 }
         
 void NetworkSocket::set_nonblocking (bool nonblocking) {
@@ -158,11 +162,14 @@
  
 NetworkSocket* NetworkSocket::accept (NetworkAddress *src) {
     int new_fd;
-    sockaddr_storage addr;
-    socklen_t addrlen = sizeof(addr);
 
     // try and get the FD
-    if ((new_fd = ::accept(fd, (sockaddr *) &addr, &addrlen)) < 0)
+    // pass src sock* pointers if provided
+    if ((new_fd = ::accept(
+            fd, 
+            src ? src->get_sockaddr() : NULL,
+            src ? src->get_socklen_ptr() : NULL
+    )) < 0)
         throw NetworkSocketErrno(*this, "accept");
     
     // allocate new NetworkSocket for new_fd
@@ -170,13 +177,13 @@
     
     // update src
     if (src)
-        src->set_sockaddr((sockaddr *) &addr, addrlen);    
+        src->update();
 
     // done
     return socket;
 }
         
-void NetworkSocket::connect (const NetworkAddress &addr) {
+void NetworkSocket::connect (const NetworkEndpoint &addr) {
     // get our addrinfo
     addrinfo *r, *results = addr.get_addrinfo(type.family, type.socktype, type.protocol);
     
@@ -208,7 +215,7 @@
     }
    
     // release our addrinfo
-    freeaddrinfo(results);
+    addr.free_addrinfo(results);
 
     // if we failed to connect, r is a NULL pointer
     if (r == NULL)
@@ -220,14 +227,8 @@
     
     // use send or sendto?
     if (dest) {
-        const sockaddr *addr;
-        socklen_t addr_len;
-        
-        // get destination address
-        addr = dest->get_sockaddr(addr_len);
-        
         // sendto()
-        if ((ret = ::sendto(fd, buf, size, 0, addr, addr_len)) < 0 && errno != EAGAIN)
+        if ((ret = ::sendto(fd, buf, size, 0, dest->get_sockaddr(), dest->get_socklen())) < 0 && errno != EAGAIN)
             throw NetworkSocketErrno(*this, "sendto");
 
     } else {
@@ -261,18 +262,13 @@
 
     // use recv or recvfrom?
     if (src) {
-        sockaddr_storage addr;
-        socklen_t addr_len = sizeof(addr);
-
         // recvfrom()
-        if ((ret = ::recvfrom(fd, buf, size, 0, (sockaddr *) &addr, &addr_len)) < 0 && errno != EAGAIN)
+        if ((ret = ::recvfrom(fd, buf, size, 0, src->get_sockaddr(), src->get_socklen_ptr())) < 0 && errno != EAGAIN)
             throw NetworkSocketErrno(*this, "recvfrom");
-
-        // update source address if recvfrom suceeded
-        if (ret > 0) {
-            // modify src...
-            src->set_sockaddr((sockaddr *) &addr, addr_len);
-        }
+        
+        // update if valid
+        if (ret > 0)
+            src->update();
 
     } else {
         // recv