将棋所4.7.1テスト版4 ではアプリケーションレベルでのkeepaliveが半角空白(SP)+改行(LF)文字の送信にて1分おきに行われているため、単に改行(LF)文字が送信されていることを想定した shogi-server 20201004 での修正 https://osdn.net/projects/shogi-server/scm/git/shogi-server/commits/8d5884aa82cc5b0b31ca115cfea891ba37ad6fe3 では不十分です。
追加的に、以下のような修正が必要になると思われます。
https://osdn.net/users/mizar/pf/shogi-server/scm/commits/7cd512b50be019cee0d9c000716be2277d50743f
- --------------------------- shogi_server/command.rb ---------------------------
- @@ -28,7 +28,7 @@ module ShogiServer
- def Command.factory(str, player, time=Time.now)
- cmd = nil
- case str
- - when "", /^%[^%]/, :timeout
- + when "", /^\s*$/, /^%[^%]/, :timeout
- cmd = SpecialCommand.new(str, player)
- when /^[\+\-][^%]/
- cmd = MoveCommand.new(str, player)
- @@ -108,8 +108,6 @@ module ShogiServer
- new_buoy_game = nil
- nth_move = nil
- cmd = ForkCommand.new(str, player, source_game, new_buoy_game, nth_move)
- - when /^\s*$/
- - cmd = SpaceCommand.new(str, player)
- when /^%%%[^%]/
- # TODO: just ignore commands specific to 81Dojo.
- # Need to discuss with 81Dojo people.
- @@ -172,7 +170,7 @@ module ShogiServer
- end
- end
- - # Command like "%TORYO", :timeout, or keep alive
- + # Command like "%TORYO", :timeout, space, or keep alive
- #
- # Keep Alive is an application-level protocol. Whenever the server receives
- # an LF, it sends back an LF. Note that the 30 sec rule (client may not send
- @@ -191,6 +189,9 @@ module ShogiServer
- @player.write_safe("\n")
- # Fall back to :timeout to check the game gets timed up
- @str = :timeout
- + elsif /^\s+$/ =~ @str
- + # Fall back to :timeout to check the game gets timed up
- + @str = :timeout
- end
- if (@player.status == "game")
- @@ -673,19 +674,6 @@ module ShogiServer
- end
- end
- - # Command for a space
- - #
- - class SpaceCommand < Command
- - def initialize(str, player)
- - super
- - end
- -
- - def call
- - ## ignore null string
- - return :continue
- - end
- - end
- -
- # Command for an error
- #
- class ErrorCommand < Command
将棋所テスト版4 のような、定期的に無意味な文字列を対局中に送信するクライアントの場合、指し手放置の時間切れを検知出来ず、対局が何時までも閉じられなくなる可能性があります。
shogi-serverにて、クライアントからの入力が一定時間無かった時(:timeout)にしか指し手放置時間切れの検知処理を行っていなかったのが原因と見られます。
* 解決案1: 検知間隔を充分に短くする
* 解決案2: KeepAliveCommand / SpaceCommand の実行時にも時間切れの検知を行う
https://osdn.net/users/mizar/pf/shogi-server/scm/commits/a128e96f671e3a2dcf38eb80b4a00b628069e1c5