@@ -67,7 +67,7 @@ def server_wait_until_stop
67
67
# conn.close
68
68
# end
69
69
# 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 )
71
71
proto ||= ( @transport_config && @transport_config . protocol == :tls ) ? :tls : :tcp
72
72
73
73
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
91
91
92
92
case proto
93
93
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 )
95
95
when :tls
96
96
transport_config = if tls_options
97
97
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
100
100
else
101
101
raise ArgumentError , "BUG: TLS transport specified, but certification options are not specified"
102
102
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 )
104
104
when :unix
105
105
raise "not implemented yet"
106
106
else
@@ -121,7 +121,7 @@ def server_create_connection(title, port, proto: nil, bind: '0.0.0.0', shared: t
121
121
# sock.remote_port
122
122
# # ...
123
123
# 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 )
125
125
proto ||= ( @transport_config && @transport_config . protocol == :tls ) ? :tls : :tcp
126
126
127
127
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
155
155
156
156
case proto
157
157
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 |
159
159
conn . data ( &callback )
160
160
end
161
161
when :tls
@@ -166,7 +166,7 @@ def server_create(title, port, proto: nil, bind: '0.0.0.0', shared: true, socket
166
166
else
167
167
raise ArgumentError , "BUG: TLS transport specified, but certification options are not specified"
168
168
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 |
170
170
conn . data ( &callback )
171
171
end
172
172
when :udp
@@ -212,8 +212,8 @@ def server_attach(title, proto, port, bind, shared, server)
212
212
event_loop_attach ( server )
213
213
end
214
214
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 )
217
217
socket_option_setter . call ( sock )
218
218
close_callback = -> ( conn ) { @_server_mutex . synchronize { @_server_connections . delete ( conn ) } }
219
219
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_
227
227
server
228
228
end
229
229
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 )
231
231
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 )
233
233
socket_option_setter . call ( sock )
234
234
close_callback = -> ( conn ) { @_server_mutex . synchronize { @_server_connections . delete ( conn ) } }
235
235
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
379
379
ServerEngine ::SocketManager ::Client . new ( socket_manager_path )
380
380
end
381
381
382
- def server_create_tcp_socket ( shared , bind , port )
382
+ def server_create_tcp_socket ( shared , bind , port , bind_ipv6_only = true )
383
383
sock = if shared
384
384
server_socket_manager_client . listen_tcp ( bind , port )
385
385
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 )
389
392
tsock . autoclose = false
390
393
TCPServer . for_fd ( tsock . fileno )
391
394
end
@@ -394,7 +397,7 @@ def server_create_tcp_socket(shared, bind, port)
394
397
sock
395
398
end
396
399
397
- def server_create_udp_socket ( shared , bind , port )
400
+ def server_create_udp_socket ( shared , bind , port , bind_ipv6_only = true )
398
401
sock = if shared
399
402
server_socket_manager_client . listen_udp ( bind , port )
400
403
else
0 commit comments