diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs
index f8feb4eba53686d87678590e5f9b8352a6f13726..e099d15e349c396e74f8af91a7db10cbde2961a4 100644
--- a/src/header/netdb/mod.rs
+++ b/src/header/netdb/mod.rs
@@ -204,23 +204,25 @@ fn lookup_host(host: &str) -> Result<LookupHost, c_int> {
         let packet_data_box = packet_data.into_boxed_slice();
         let packet_data_ptr = Box::into_raw(packet_data_box) as *mut _ as *mut c_void;
 
-        let sock = unsafe { sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32) };
-
-        let mut dest = sockaddr_in {
+        let dest = sockaddr_in {
             sin_family: AF_INET as u16,
             sin_port: htons(53),
             sin_addr: in_addr { s_addr: dns_addr },
             ..Default::default()
         };
+        let dest_ptr = &dest as *const _ as *const sockaddr;
 
-        let dest_ptr = &mut dest as *mut _ as *mut sockaddr;
-
-        unsafe {
-            if sys_socket::sendto(sock, packet_data_ptr, packet_data_len, 0, dest_ptr, 16) < 0 {
+        let sock = unsafe {
+            let sock = sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32);
+            if sys_socket::connect(sock, dest_ptr, mem::size_of_val(&dest) as socklen_t) < 0 {
+                return Err(EIO);
+            }
+            if sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) < 0 {
                 Box::from_raw(packet_data_ptr);
                 return Err(EIO);
             }
-        }
+            sock
+        };
 
         unsafe {
             Box::from_raw(packet_data_ptr);
@@ -232,12 +234,8 @@ fn lookup_host(host: &str) -> Result<LookupHost, c_int> {
 
         let mut count = -1;
 
-        let mut from: sockaddr = Default::default();
-        let from_ptr = &mut from as *mut sockaddr;
-
         unsafe {
-            count =
-                sys_socket::recvfrom(sock, buf_ptr, 65536, 0, from_ptr, &mut i as *mut socklen_t);
+            count = sys_socket::recv(sock, buf_ptr, 65536, 0);
         }
         if count < 0 {
             return Err(EIO);
@@ -321,9 +319,7 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> {
         let packet_data_box = packet_data.into_boxed_slice();
         let packet_data_ptr = Box::into_raw(packet_data_box) as *mut _ as *mut c_void;
 
-        let sock = unsafe { sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32) };
-
-        let mut dest = sockaddr_in {
+        let dest = sockaddr_in {
             sin_family: AF_INET as u16,
             sin_port: htons(53),
             sin_addr: in_addr {
@@ -332,10 +328,18 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> {
             ..Default::default()
         };
 
-        let dest_ptr = &mut dest as *mut _ as *mut sockaddr;
+        let dest_ptr = &dest as *const _ as *const sockaddr;
+
+        let sock = unsafe {
+            let sock = sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32);
+            if sys_socket::connect(sock, dest_ptr, mem::size_of_val(&dest) as socklen_t) < 0 {
+                return Err(EIO);
+            }
+            sock
+        };
 
         unsafe {
-            if sys_socket::sendto(sock, packet_data_ptr, packet_data_len, 0, dest_ptr, 16) < 0 {
+            if sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) < 0 {
                 return Err(EIO);
             }
         }
@@ -351,8 +355,7 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> {
         let mut count = -1;
 
         unsafe {
-            count =
-                sys_socket::recvfrom(sock, buf_ptr, 65536, 0, dest_ptr, &mut i as *mut socklen_t);
+            count = sys_socket::recv(sock, buf_ptr, 65536, 0);
         }
         if count < 0 {
             return Err(EIO);
diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index 98b640f465943286c0e1bcc87e9cdfd25f1ee4ca..d63ab64462c4e85fa1d24d3fae15981b05f686be 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -36,16 +36,12 @@ macro_rules! bind_or_connect {
             return -1;
         }
         let data = &*($address as *const sockaddr_in);
-        let addr = data.sin_addr.s_addr;
-        let port = in_port_t::from_be(data.sin_port);
-        let path = format!(
-            bind_or_connect!($mode "{}.{}.{}.{}:{}"),
-            addr >> 8 * 3,
-            addr >> 8 * 2 & 0xFF,
-            addr >> 8 & 0xFF,
-            addr & 0xFF,
-            port
+        let addr = slice::from_raw_parts(
+            &data.sin_addr.s_addr as *const _ as *const u8,
+            mem::size_of_val(&data.sin_addr.s_addr)
         );
+        let port = in_port_t::from_be(data.sin_port);
+        let path = format!(bind_or_connect!($mode "{}.{}.{}.{}:{}"), addr[0], addr[1], addr[2], addr[3], port);
 
         // Duplicate the socket, and then duplicate the copy back to the original fd
         let fd = e(syscall::dup($socket as usize, path.as_bytes()));