目次
クライアントのライフサイクル
- create
- bind
- connect
- close
- create(生成)の部分はクライアントもサーバも同じ
クライアントのbind
- サーバは大抵の場合、
bind
を使ってアドレスとポートに紐付けを行う
- クライアントでは、
bind
を使うことはまれである
bind
を使わなかった場合、クライアントソケットはランダムなエフェメラルポートに紐付けられる
- クライアントは外部からの接続を受け付ける必要が無いので、ポート番号を明示する必要もない
クライアントのconnect
connect
を呼び出すと、リモートのソケットへの接続が始まる
require 'socket'
socket = Socket.new(:INET, :STREAM)
# 80番ポートでgoogle.comへの接続を開始する
remote_addr = Socket.pack_sockaddr_in(80, 'google.com')
socket.connect(remote_addr)
接続の消失
- 存在しないサーバや、接続を受け付ける準備ができていないサーバにアクセスすると、クライアントはレスポンス待ちで固まってしまう
- 最終的に
Errno::ETIMEDOUT
が発生する
Rubyによるラッパー
socket = TCPSocket.new('google.com', 80)
Socket.tcp('google.com', 80) do |connection|
connection.write "GET / HTTP/1.1\r\n"
connection.close
end
本章で扱ったシステムコール
コメントをどうぞ