TCP KeepAlive パラメータを個別指定する
/proc/sys/net/ipv4/tcp_keepalive_time 等の変更を行わずとも、shogi-serverでのTCP Keepalive間隔を独自に指定できるように。
https://osdn.net/users/mizar/pf/shogi-server/scm/commits/e37932a0d2387227928808ec86f49362ae29f9ea
--------------------------------- shogi-server --------------------------------- @@ -208,7 +208,10 @@ def parse_command_line ["--least-time-per-move", GetoptLong::REQUIRED_ARGUMENT], ["--max-moves", GetoptLong::REQUIRED_ARGUMENT], ["--pid-file", GetoptLong::REQUIRED_ARGUMENT], - ["--player-log-dir", GetoptLong::REQUIRED_ARGUMENT]) + ["--player-log-dir", GetoptLong::REQUIRED_ARGUMENT], + ["--tcpkeepalive-idle", GetoptLong::REQUIRED_ARGUMENT], + ["--tcpkeepalive-intvl", GetoptLong::REQUIRED_ARGUMENT], + ["--tcpkeepalive-cnt", GetoptLong::REQUIRED_ARGUMENT]) parser.quiet = true begin parser.each_option do |name, arg| @@ -283,6 +286,15 @@ def check_command_line $options["least-time-per-move"] ||= ShogiServer::Default_Least_Time_Per_Move $options["least-time-per-move"] = $options["least-time-per-move"].to_i + + $options["tcpkeepalive-idle"] ||= ShogiServer::Default_TcpKeepAlive_Idle + $options["tcpkeepalive-idle"] = $options["tcpkeepalive-idle"].to_i + + $options["tcpkeepalive-intvl"] ||= ShogiServer::Default_TcpKeepAlive_Intvl + $options["tcpkeepalive-intvl"] = $options["tcpkeepalive-intvl"].to_i + + $options["tcpkeepalive-cnt"] ||= ShogiServer::Default_TcpKeepAlive_Cnt + $options["tcpkeepalive-cnt"] = $options["tcpkeepalive-cnt"].to_i end # See if a file can be created in the directory. @@ -455,8 +467,30 @@ def main server.start do |client| begin # client.sync = true # this is already set in WEBrick - client.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) - # Keepalive time can be set by /proc/sys/net/ipv4/tcp_keepalive_time + if Socket.const_defined?(:SOL_SOCKET) && + Socket.const_defined?(:SO_KEEPALIVE) && + Socket.const_defined?(:IPPROTO_TCP) + client.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) + # Keepalive time can be set by /proc/sys/net/ipv4/tcp_keepalive_time + if Socket.const_defined?(:TCP_KEEPIDLE) && + Socket.const_defined?(:TCP_KEEPINTVL) && + Socket.const_defined?(:TCP_KEEPCNT) + client.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPIDLE, $options["tcpkeepalive-idle"]) + client.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL, $options["tcpkeepalive-intvl"]) + client.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT, $options["tcpkeepalive-cnt"]) + elsif RUBY_PLATFORM.downcase =~ /mswin|mingw|cygwin|bccwin/ + # Windows 10 (1709 or later) ws2ipdef.h + # https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options + client.setsockopt(Socket::IPPROTO_TCP, 3, $options["tcpkeepalive-idle"]) + client.setsockopt(Socket::IPPROTO_TCP, 17, $options["tcpkeepalive-intvl"]) + client.setsockopt(Socket::IPPROTO_TCP, 16, $options["tcpkeepalive-cnt"]) + elsif RUBY_PLATFORM.downcase =~ /darwin/ + # macOS 10.12.6 (Sierra) /usr/include/netinet/tcp.h + client.setsockopt(Socket::IPPROTO_TCP, 0x10, $options["tcpkeepalive-idle"]) + client.setsockopt(Socket::IPPROTO_TCP, 0x101, $options["tcpkeepalive-intvl"]) + client.setsockopt(Socket::IPPROTO_TCP, 0x102, $options["tcpkeepalive-cnt"]) + end + end player, login = login_loop(client) # loop unless player log_error("Detected a timed out login attempt") ------------------------------- shogi_server.rb ------------------------------- @@ -50,6 +50,9 @@ Default_Timeout = 60 # for single socket operation Default_Game_Name = "default-1500-0" Default_Max_Moves = 256 Default_Least_Time_Per_Move = 0 +Default_TcpKeepAlive_Idle = 50 +Default_TcpKeepAlive_Intvl = 5 +Default_TcpKeepAlive_Cnt = 9 One_Time = 10 Login_Time = 300 # time for LOGIN Revision = "20160409"
/proc/sys/net/ipv4/tcp_keepalive_time 等の変更を行わずとも、shogi-serverでのTCP Keepalive間隔を独自に指定できるように。
https://osdn.net/users/mizar/pf/shogi-server/scm/commits/e37932a0d2387227928808ec86f49362ae29f9ea