Working with TCP Sockets 読書メモ 目次
プロセスごとの接続
- このアーキテクチャではリクエストの並列処理が可能になる
- 接続を受け付け後、サーバは子プロセスを
fork
してコネクションを処理させる
forkの基礎
- プログラムを実行すると新しいプロセスが立ち上げられる
fork
を使うと実行時に新しいプロセスを作成できる- 流れは以下のようになる
- クライアントがサーバに接続する
- メインのサーバプロセスが接続を受け付ける
- メインプロセスは、自身のコピーを子プロセスとしてforkする
- 子プロセスが接続を処理する
- 子プロセスは並列に実行される
- 接続を受け付ける親プロセスは常に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
Process.detach
を使うことでプロセスを終了している- プロセスについてもっと知りたい人は、同じ著者のWorking WIth Unix Processesよを読むと良い
- 日本語訳:なるほどUNIXプロセス
考察
- 利点:シンプル、並列性がある
- 欠点:子プロセスの数に上限がない、
fork
はUNIXでしか動かない