--- 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