Working with TCP Sockets 読書メモ 第17章 プロセスごとの接続

Working with TCP Sockets 読書メモ 目次

プロセスごとの接続

  • このアーキテクチャではリクエストの並列処理が可能になる
  • 接続を受け付け後、サーバは子プロセスをforkしてコネクションを処理させる

forkの基礎

  • プログラムを実行すると新しいプロセスが立ち上げられる
  • forkを使うと実行時に新しいプロセスを作成できる
  • 流れは以下のようになる
  1. クライアントがサーバに接続する
  2. メインのサーバプロセスが接続を受け付ける
  3. メインプロセスは、自身のコピーを子プロセスとしてforkする
  4. 子プロセスが接続を処理する
  • 子プロセスは並列に実行される
  • 接続を受け付ける親プロセスは常に1つだけ

実装

require 'socket'
require_relative 'command_handler'

module FTP
  class ProcessPerConnection
    CRLF = "\r\n"

    def initialize(port = 21)
      @control_socket = TCPServer.new(port)
      trap(:INT) { exit }
    end

    def gets
      @client.gets(CRLF)
    end

    def respond(message)
      @client.write(message)
      @client.write(CRLF)
    end

    def run
      loop do
        @client = @control_socket.accept

        pid = fork do
          respond "220 OHAI"

          handler = CommandHandler.new(self)

          loop do
            request = gets

            if request
              respond handler.handle(request)
            else
              @client.close
              break
            end
          end
        end

        Process.detach(pid)
      end
    end
  end
end

server = FTP::ProcessPerConnection.new(4481)
server.run

考察

  • 利点:シンプル、並列性がある
  • 欠点:子プロセスの数に上限がない、forkはUNIXでしか動かない

コメントをどうぞ

コメントを残す