Working with TCP Sockets 読書メモ 目次
緊急データ
- TCPではデータの送信は順番に行われる
- 緊急データ(Out of bandデータ)は順番を無視して最優先で送信できる
Socket#send
はSocket#write
の特別版Socket#send
の第2引数にフラグを渡すことで挙動を制御できる
緊急データの送信
require 'socket'
socket = TCPSocket.new 'localhost', 4481
socket.write 'first'
socket.write 'second'
socket.send '!', Socket::MSG_OOB
- 緊急データの送信には、
send
メソッドの呼び出し時にSocket::MSG_OOB
を渡す - 緊急データの送受信には、クライアントだけでなくサーバの対応も必要
緊急データの受信
require 'socket'
Socket.tcp_server_loop(4481) do |connection|
urgent_data = connection.recv(1, Socket::MSG_OOB)
data = connection.readpartial(1024)
end
- 緊急データの受信には
Socket#recv
をSocket::MSG_OOB
フラグ付きで使う必要がある - 通常のデータが先に送信された場合でも、緊急データを先に受け取ることができる
制限
- TCPの緊急データは、一度に1バイトしか送れない
緊急データとIO.select
IO.select
は、緊急データに対しては正しく動作しないことが多い- 上記の制限と難点があるため、緊急データ送信機能はほとんど使われない
SO_OOBINLINEオプション
- 通常のデータのストリームの中に緊急データを埋め込むこともできる
SO_OOBINLINE
オプションを使用する- このオプションは受信側でのみ使用可能
require 'socket'
Socket.tcp_server_loop(4481) do |connection|
connection.setsockopt :SOCKET, :OOBINLINE, true
connection.readpartial(1024)
end