From ac2be5636fe881bf5ff14cf5d1c4a85affa0aebc Mon Sep 17 00:00:00 2001
From: Juan Wajnerman <jwajnerman@manas.com.ar>
Date: Wed, 20 Aug 2014 21:55:32 -0300
Subject: [PATCH] Use SO_REUSEADDR for TCP server (until a better aproach is
 implemented to make development easier)

---
 src/socket/socket.cr     | 3 +++
 src/socket/tcp_server.cr | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/src/socket/socket.cr b/src/socket/socket.cr
index f81b17513e..982c56843e 100644
--- a/src/socket/socket.cr
+++ b/src/socket/socket.cr
@@ -38,8 +38,11 @@ lib C
   fun accept(fd : Int32, addr : SockAddrIn*, addr_len : Int32*) : Int32
   fun connect(fd : Int32, addr : SockAddrIn*, addr_len : Int32) : Int32
   fun gethostbyname(name : UInt8*) : HostEnt*
+  fun setsockopt(sock : Int32, level : Int32, opt : Int32, optval : Void*, optlen : Int32) : Int32
 
   SOCK_STREAM = 1
+  SOL_SOCKET = 0xffff
+  SO_REUSEADDR = 0x0004
 end
 
 require "./*"
diff --git a/src/socket/tcp_server.cr b/src/socket/tcp_server.cr
index f568dafd29..898d5dd218 100644
--- a/src/socket/tcp_server.cr
+++ b/src/socket/tcp_server.cr
@@ -2,6 +2,9 @@ class TCPServer
   def initialize(port, backlog = 128)
     @sock = C.socket(C::AF_INET, C::SOCK_STREAM, 0)
 
+    optval = 1
+    C.setsockopt(@sock, C::SOL_SOCKET, C::SO_REUSEADDR, pointerof(optval) as Void*, sizeof(Int32))
+
     addr = C::SockAddrIn.new
     addr.family = C::AF_INET
     addr.addr = 0_u32
-- 
GitLab