@@ -67,7 +67,7 @@ def server_wait_until_stop
6767      #     conn.close 
6868      #   end 
6969      # end 
70-       def  server_create_connection ( title ,  port ,  proto : nil ,  bind : '0.0.0.0' ,  shared : true ,  backlog : nil ,  tls_options : nil ,  **socket_options ,  &block ) 
70+       def  server_create_connection ( title ,  port ,  proto : nil ,  bind : '0.0.0.0' ,  shared : true ,  bind_ipv6_only :  true ,   backlog : nil ,  tls_options : nil ,  **socket_options ,  &block ) 
7171        proto  ||= ( @transport_config  && @transport_config . protocol  == :tls )  ? :tls  : :tcp 
7272
7373        raise  ArgumentError ,  "BUG: title must be a symbol"  unless  title  && title . is_a? ( Symbol ) 
@@ -91,7 +91,7 @@ def server_create_connection(title, port, proto: nil, bind: '0.0.0.0', shared: t
9191
9292        case  proto 
9393        when  :tcp 
94-           server  =  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter ,  &block ) 
94+           server  =  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter ,  bind_ipv6_only ,   &block ) 
9595        when  :tls 
9696          transport_config  =  if  tls_options 
9797                               server_create_transport_section_object ( tls_options ) 
@@ -100,7 +100,7 @@ def server_create_connection(title, port, proto: nil, bind: '0.0.0.0', shared: t
100100                             else 
101101                               raise  ArgumentError ,  "BUG: TLS transport specified, but certification options are not specified" 
102102                             end 
103-           server  =  server_create_for_tls_connection ( shared ,  bind ,  port ,  transport_config ,  backlog ,  socket_option_setter ,  &block ) 
103+           server  =  server_create_for_tls_connection ( shared ,  bind ,  port ,  transport_config ,  backlog ,  socket_option_setter ,  bind_ipv6_only ,   &block ) 
104104        when  :unix 
105105          raise  "not implemented yet" 
106106        else 
@@ -121,7 +121,7 @@ def server_create_connection(title, port, proto: nil, bind: '0.0.0.0', shared: t
121121      #   sock.remote_port 
122122      #   # ... 
123123      # end 
124-       def  server_create ( title ,  port ,  proto : nil ,  bind : '0.0.0.0' ,  shared : true ,  socket : nil ,  backlog : nil ,  tls_options : nil ,  max_bytes : nil ,  flags : 0 ,  **socket_options ,  &callback ) 
124+       def  server_create ( title ,  port ,  proto : nil ,  bind : '0.0.0.0' ,  shared : true ,  socket : nil ,  bind_ipv6_only :  true ,   backlog : nil ,  tls_options : nil ,  max_bytes : nil ,  flags : 0 ,  **socket_options ,  &callback ) 
125125        proto  ||= ( @transport_config  && @transport_config . protocol  == :tls )  ? :tls  : :tcp 
126126
127127        raise  ArgumentError ,  "BUG: title must be a symbol"  unless  title  && title . is_a? ( Symbol ) 
@@ -155,7 +155,7 @@ def server_create(title, port, proto: nil, bind: '0.0.0.0', shared: true, socket
155155
156156        case  proto 
157157        when  :tcp 
158-           server  =  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter )  do  |conn |
158+           server  =  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter ,   bind_ipv6_only )  do  |conn |
159159            conn . data ( &callback ) 
160160          end 
161161        when  :tls 
@@ -166,7 +166,7 @@ def server_create(title, port, proto: nil, bind: '0.0.0.0', shared: true, socket
166166                             else 
167167                               raise  ArgumentError ,  "BUG: TLS transport specified, but certification options are not specified" 
168168                             end 
169-           server  =  server_create_for_tls_connection ( shared ,  bind ,  port ,  transport_config ,  backlog ,  socket_option_setter )  do  |conn |
169+           server  =  server_create_for_tls_connection ( shared ,  bind ,  port ,  transport_config ,  backlog ,  socket_option_setter ,   bind_ipv6_only )  do  |conn |
170170            conn . data ( &callback ) 
171171          end 
172172        when  :udp 
@@ -212,8 +212,8 @@ def server_attach(title, proto, port, bind, shared, server)
212212        event_loop_attach ( server ) 
213213      end 
214214
215-       def  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter ,  &block ) 
216-         sock  =  server_create_tcp_socket ( shared ,  bind ,  port ) 
215+       def  server_create_for_tcp_connection ( shared ,  bind ,  port ,  backlog ,  socket_option_setter ,  bind_ipv6_only   =   true ,   &block ) 
216+         sock  =  server_create_tcp_socket ( shared ,  bind ,  port ,   bind_ipv6_only ) 
217217        socket_option_setter . call ( sock ) 
218218        close_callback  =  -> ( conn ) {  @_server_mutex . synchronize {  @_server_connections . delete ( conn )  }  } 
219219        server  =  Coolio ::TCPServer . new ( sock ,  nil ,  EventHandler ::TCPServer ,  socket_option_setter ,  close_callback ,  @log ,  @under_plugin_development ,  block )  do  |conn |
@@ -227,9 +227,9 @@ def server_create_for_tcp_connection(shared, bind, port, backlog, socket_option_
227227        server 
228228      end 
229229
230-       def  server_create_for_tls_connection ( shared ,  bind ,  port ,  conf ,  backlog ,  socket_option_setter ,  &block ) 
230+       def  server_create_for_tls_connection ( shared ,  bind ,  port ,  conf ,  backlog ,  socket_option_setter ,  bind_ipv6_only   =   true ,   &block ) 
231231        context  =  cert_option_create_context ( conf . version ,  conf . insecure ,  conf . ciphers ,  conf ) 
232-         sock  =  server_create_tcp_socket ( shared ,  bind ,  port ) 
232+         sock  =  server_create_tcp_socket ( shared ,  bind ,  port ,   bind_ipv6_only ) 
233233        socket_option_setter . call ( sock ) 
234234        close_callback  =  -> ( conn ) {  @_server_mutex . synchronize {  @_server_connections . delete ( conn )  }  } 
235235        server  =  Coolio ::TCPServer . new ( sock ,  nil ,  EventHandler ::TLSServer ,  context ,  socket_option_setter ,  close_callback ,  @log ,  @under_plugin_development ,  block )  do  |conn |
@@ -379,13 +379,16 @@ def server_socket_manager_client
379379        ServerEngine ::SocketManager ::Client . new ( socket_manager_path ) 
380380      end 
381381
382-       def  server_create_tcp_socket ( shared ,  bind ,  port ) 
382+       def  server_create_tcp_socket ( shared ,  bind ,  port ,   bind_ipv6_only   =   true ) 
383383        sock  =  if  shared 
384384                 server_socket_manager_client . listen_tcp ( bind ,  port ) 
385385               else 
386-                  # TCPServer.new doesn't set IPV6_V6ONLY flag, so use Addrinfo class instead. 
387-                  # backlog will be set by the caller, we don't need to set backlog here 
388-                  tsock  =  Addrinfo . tcp ( bind ,  port ) . listen 
386+                  addrinfo  =  Addrinfo . tcp ( bind ,  port ) 
387+                  tsock  =  ::Socket . new ( addrinfo . pfamily ,  addrinfo . socktype ,  addrinfo . protocol ) 
388+                  tsock . ipv6only!  if  addrinfo . ipv6?  && bind_ipv6_only 
389+                  tsock . setsockopt ( ::Socket ::SOL_SOCKET ,  ::Socket ::SO_REUSEADDR ,  1 ) 
390+                  tsock . bind ( addrinfo ) 
391+                  tsock . listen ( ::Socket ::SOMAXCONN ) 
389392                 tsock . autoclose  =  false 
390393                 TCPServer . for_fd ( tsock . fileno ) 
391394               end 
0 commit comments