#include <types.h>
#include <netinet/in.h>
#endif
-#ifdef __NETBSD__
-#ifndef _NETBSD_SOURCE
-#define _NETBSD_SOURCE
-#endif
-#ifndef _LIBC
-#define _LIBC
-#endif
-#endif
#include <netdb.h>
#include <sys/ioctl.h>
return he;
}
-#if defined(HAVE_GETHOSTBYNAME)
+#if defined(HAVE_GETSERVBYNAME)
static struct servent * deepCopyServent(struct servent *s,
const struct servent *se,
char *buffer, int size)
state after being previously closed.
*/
if (m_reusable)
+ {
setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+#ifdef SO_REUSEPORT
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(u_long));
+#endif
+ }
/* Bind to the local address,
* retrieve the actual address bound,
ioctl(m_fd, FIONBIO, &arg);
#endif
+ // If the reuse flag is set, use the applicable socket reuse flags(s)
+ if (m_reusable)
+ {
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+#ifdef SO_REUSEPORT
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(u_long));
+#endif
+ }
+
+ // If a local address has been set, then we need to bind to it before calling connect
+ if (m_local && m_local->m_addr)
+ {
+ bind(m_fd, m_local->m_addr, m_local->m_len);
+ }
+
/* Connect it to the peer address, with a timeout (see below) */
ret = connect(m_fd, m_peer->m_addr, m_peer->m_len);