Working with TCP Sockets 読書メモ 第14章 緊急データ

Working with TCP Sockets 読書メモ 目次

緊急データ

  • TCPではデータの送信は順番に行われる
  • 緊急データ(Out of bandデータ)は順番を無視して最優先で送信できる
  • Socket#sendSocket#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#recvSocket::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

コメントをどうぞ

コメントを残す