ネットワークエンジニアから着物屋さんとして独立しました。ネットショップのIT面を中心にお伝えします

TremaでTCPフラグを個々に取得する方法

»

 Class: Trema::PacketInによると、“(Integer) tcp_flags”というメソッドがありますが、SYNやACKなどのフラグを 個々に取得してくれるのではなく、まとめてIntegerで返してしまいます。

 ないよりはあるだけありがたいのですが、できれば「引数にSYNを入れたら、フラグが立っ ていればTrueを返す」といった実用的な方法での実装があるともっといいのではと思っています。

 という動機から、ライブラリを作ってみました。Tremaではやりたいことがあっても、 まずは基礎的なライブラリ作りからするので時間がかかります……。orz

  •  is_tcp_flag?( message, flag ) メソッド: 引数にpacket_inイベントからのmessageと、 チェックしたいフラグの文字列を入れます。'SIN'、'ACK'、'PSH'、'FIN'、'RST'が使えま す。
  •  list_tcp_flag( message ) メソッド: 引数にpacket_inイベントからのmessageを入れると、 立っているフラグを一覧表示します。

module PacketInfo
def is_tcp_flag?( message, flag )
if flag == 'SIN' then
flag_digit = 2
elsif flag == 'ACK' then
flag_digit = 5
elsif flag == 'FIN' then
flag_digit = 1
elsif flag == 'PSH' then
flag_digit = 4
elsif flag == 'RST' then
flag_digit = 3
else
return false
end
tcp_flags_bin = message.tcp_flags.to_s(2).to_s #info "tcp_flags_bin: " + tcp_flags_bin + ", length: " + tcp_flags_bin.length.to_s if tcp_flags_bin.length >= flag_digit then flag_bin = tcp_flags_bin.slice(tcp_flags_bin.length - flag_digit, 1) #info "flag_bin: " + flag_bin else #info "Length isn't enough" return false end if flag_bin == '1' then return true elsif flag_bin == '0' then return false else info "Error: flag_sin isn't 1 nor 0." end
end def list_tcp_flag( message ) if is_tcp_flag? message, 'SIN' then print "SIN " end if is_tcp_flag? message, 'PSH' then print "PSH " end if is_tcp_flag? message, 'FIN' then print "FIN " end if is_tcp_flag? message, 'ACK' then print "ACK " end if is_tcp_flag? message, 'RST' then print "RST " end puts '' end
end
Comment(0)

コメント

コメントを投稿する