4

サーバーが閉じTCPServerて再起動し、すべてのユーザーをファイルに保存してすぐに再読み込みする状況があります。それらの接続は切断されません。

問題は、ストリームを再初期化できないように見えることです。

再起動する (そして接続を維持しようとする) ときに、TCPServer を再初期化し、接続ユーザーの配列をロードします。これらはそれぞれ既存のソケット アドレスを持っているため、<TCPSocket:0x00000000000000>TCPServer でこれらのアドレスを再初期化できますか?

通常、各ユーザーが接続して受け入れられます。

$nCS = TCPServer.new(HOST, PORT)

begin
  while socket = $nCS.accept
    Thread.new( socket ) do |sock|
      begin
        d = User.new(sock)
        while sock.gets
          szIn = $_.chomp
          DBG( "Received '" + szIn + "' from Client " + sock.to_s )
          d.parseInput( szIn )
        end
      rescue => e
        $stdout.puts "ERROR: Caught error in Client Thread: #{e} \r\n #{e.backtrace.to_s.gsub(",", ",\r\n")}"
        sock.write("Sorry, an error has occurred, and you have been disconnected."+EOL+"Please try again later."+EOL)
        d.closeConnection
      end
    end
  end
rescue => e
  $stdout.puts "ERROR: Caught error in Server Thread: #{e} \r\n #{e.backtrace.to_s.gsub(",", ",\r\n")}"
  exit
end

ホット リブートのコマンドを与えるためにexec('./main --copyover')、コピー オーバーが発生していることを示すフラグを使用します。

すべてのユーザーの配列を保持し、各ユーザーがソケットを持っている場合$connected、再起動前に開いていたソケットを再初期化するにはどうすればよいですか (もう一方の端がまだ接続されていると仮定します)。

これは単にプロセスをexec("./main", "--copyover", *$nCS, *$connected)置き換え、ファイルを維持する必要があるためです(ファイルを閉じないでください)。

4

2 に答える 2

1

できません。ソケットは、プロセスの存続期間中のみ有効です。プロセスが終了すると、OS によって閉じられます。これにより接続が無効になるため、もう一方の端はまだ接続されていません。

于 2012-09-04T23:52:31.210 に答える