Index: benchmark/io/http/Makefile.am
===================================================================
--- benchmark/io/http/Makefile.am	(revision 153570dbab5d76eacc3d15ae36b7c7ad38c79538)
+++ benchmark/io/http/Makefile.am	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
@@ -21,5 +21,5 @@
 include $(top_srcdir)/tools/build/cfa.make
 
-AM_CFLAGS = -O3 -Wall -Wextra -I$(srcdir) -lrt -pthread # -Werror
+AM_CFLAGS = -O3 -Wall -Wextra -I$(srcdir) -lrt -pthread -g # -Werror
 AM_CFAFLAGS = -quiet -nodebug
 AM_LDFLAGS = -quiet -nodebug
@@ -39,4 +39,6 @@
 	protocol.cfa \
 	protocol.hfa \
+	socket.cfa \
+	socket.hfa \
 	worker.cfa \
 	worker.hfa
Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision 153570dbab5d76eacc3d15ae36b7c7ad38c79538)
+++ benchmark/io/http/main.cfa	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
@@ -23,4 +23,5 @@
 #include "filecache.hfa"
 #include "options.hfa"
+#include "socket.hfa"
 #include "worker.hfa"
 
@@ -195,4 +196,5 @@
 //============================================================================================='
 int main( int argc, char * argv[] ) {
+	int ret;
 	__sighandler_t s = 1p;
 	signal(SIGPIPE, s);
@@ -226,46 +228,9 @@
 	// Open Socket
 	sout | getpid() | ": Listening on port" | options.socket.port;
-	int server_fd = socket(AF_INET, SOCK_STREAM, 0);
-	if(server_fd < 0) {
-		abort( "socket error: (%d) %s\n", (int)errno, strerror(errno) );
-	}
-
-	int ret = 0;
+
 	struct sockaddr_in address;
-	int addrlen = sizeof(address);
-	memset( (char *)&address, '\0' );
-	address.sin_family = AF_INET;
-	address.sin_addr.s_addr = htonl(INADDR_ANY);
-	address.sin_port = htons( options.socket.port );
-
-	int waited = 0;
-	for() {
-		int sockfd = server_fd;
-		__CONST_SOCKADDR_ARG addr;
-		addr.__sockaddr__ = (struct sockaddr *)&address;
-		socklen_t addrlen = sizeof(address);
-		ret = bind( sockfd, addr, addrlen );
-		if(ret < 0) {
-			if(errno == EADDRINUSE) {
-				if(waited == 0) {
-					if(!options.interactive) abort | "Port already in use in non-interactive mode. Aborting";
-					sout | "Waiting for port";
-				} else {
-					sout | "\r" | waited | nonl;
-					flush( sout );
-				}
-				waited ++;
-				sleep( 1`s );
-				continue;
-			}
-			abort( "bind error: (%d) %s\n", (int)errno, strerror(errno) );
-		}
-		break;
-	}
-
-	ret = listen( server_fd, options.socket.backlog );
-	if(ret < 0) {
-		abort( "listen error: (%d) %s\n", (int)errno, strerror(errno) );
-	}
+	int addrlen = prepaddr(address);
+
+	int server_fd = listener(address, addrlen);
 
 	//===================
@@ -361,4 +326,8 @@
 				sout | "Stopping connection threads..." | nonl; flush( sout );
 				for(i; options.clopts.nworkers) {
+					for(j; 2) {
+						ret = close(workers[i].pipe[j]);
+						if(ret < 0) abort( "close pipe %d error: (%d) %s\n", j, (int)errno, strerror(errno) );
+					}
 					join(workers[i]);
 				}
@@ -384,11 +353,11 @@
 		sout | "done";
 
-		sout | "Closing splice fds..." | nonl; flush( sout );
-		for(i; pipe_cnt) {
-			ret = close( fds[pipe_off + i] );
-			if(ret < 0) {
-				abort( "close pipe error: (%d) %s\n", (int)errno, strerror(errno) );
-			}
-		}
+		// sout | "Closing splice fds..." | nonl; flush( sout );
+		// for(i; pipe_cnt) {
+		// 	ret = close( fds[pipe_off + i] );
+		// 	if(ret < 0) {
+		// 		abort( "close pipe error: (%d) %s\n", (int)errno, strerror(errno) );
+		// 	}
+		// }
 		free(fds);
 		sout | "done";
Index: benchmark/io/http/socket.cfa
===================================================================
--- benchmark/io/http/socket.cfa	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
+++ benchmark/io/http/socket.cfa	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
@@ -0,0 +1,68 @@
+#define _GNU_SOURCE
+
+#include "socket.hfa"
+
+#include <errno.h>
+#include <string.h>
+extern "C" {
+	#include <sys/socket.h>
+	#include <netinet/in.h>
+}
+
+#include <fstream.hfa>
+#include <time.hfa>
+#include <thread.hfa>
+
+#include "options.hfa"
+
+int prepaddr(struct sockaddr_in & address) {
+	int addrlen = sizeof(address);
+	memset( (char *)&address, '\0', addrlen );
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = htonl(INADDR_ANY);
+	address.sin_port = htons( options.socket.port );
+	return addrlen;
+}
+
+int listener(struct sockaddr_in & address, int addrlen) {
+	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
+	if(sockfd < 0) {
+		abort( "socket error: (%d) %s\n", (int)errno, strerror(errno) );
+	}
+
+	int value = 1;
+	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(int)) < 0)
+		abort( "setsockopt error: (%d) %s\n", (int)errno, strerror(errno) );
+
+	int ret = 0;
+	int waited = 0;
+	for() {
+		__CONST_SOCKADDR_ARG addr;
+		addr.__sockaddr__ = (struct sockaddr *)&address;
+		socklen_t addrlen = sizeof(address);
+		ret = bind( sockfd, addr, addrlen );
+		if(ret < 0) {
+			if(errno == EADDRINUSE) {
+				if(waited == 0) {
+					if(!options.interactive) abort | "Port already in use in non-interactive mode. Aborting";
+					sout | "Waiting for port";
+				} else {
+					sout | "\r" | waited | nonl;
+					flush( sout );
+				}
+				waited ++;
+				sleep( 1`s );
+				continue;
+			}
+			abort( "bind error: (%d) %s\n", (int)errno, strerror(errno) );
+		}
+		break;
+	}
+
+	ret = listen( sockfd, options.socket.backlog );
+	if(ret < 0) {
+		abort( "listen error: (%d) %s\n", (int)errno, strerror(errno) );
+	}
+
+	return sockfd;
+}
Index: benchmark/io/http/socket.hfa
===================================================================
--- benchmark/io/http/socket.hfa	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
+++ benchmark/io/http/socket.hfa	(revision c4b10e2d59149c7de76e91dbb73b8f1c9520deca)
@@ -0,0 +1,5 @@
+#pragma once
+
+struct sockaddr_in;
+int prepaddr(struct sockaddr_in & addr);
+int listener(struct sockaddr_in & address, int addrlen);
