RawSocketを使ったRubyのサンプルその1。そのうち解説がでるはず
最初のコード
# -*- encoding: utf-8 -*- require 'socket.rb' ETH_P_ALL = 0x300 def mac_to_s(frame, index) header = frame[index, 6].unpack('C*'); return sprintf('%02X:%02X:%02X:%02X:%02X:%02X', header[0], header[1], header[2], header[3], header[4], header[5]) end socket = Socket.open(Socket::AF_INET, Socket::SOCK_PACKET, ETH_P_ALL) loop do buff, sockaddr = socket.recvfrom(8192) puts mac_to_s(buff, 0) end
2番目のコード
# -*- encoding: utf-8 -*- require 'socket.rb' ETH_P_ALL = 0x300 def mac_to_s(frame, index) header = frame[index, 6].unpack('C*'); return sprintf('%02X:%02X:%02X:%02X:%02X:%02X', header[0], header[1], header[2], header[3], header[4], header[5]) end socket = Socket.open(Socket::AF_INET, Socket::SOCK_PACKET, ETH_P_ALL) loop do buff, sockaddr = socket.recvfrom(8192) puts '送信先: ' + mac_to_s(buff, 0) puts '送信元: ' + mac_to_s(buff, 6) puts 'プロトコル: 0x' + buff[12, 2].unpack('n')[0].to_s(16) end
3番目のコード
# -*- encoding: utf-8 -*- require 'socket.rb' ETH_P_ALL = 0x300 def mac_to_s(frame, index) header = frame[index, 6].unpack('C*'); return sprintf('%02X:%02X:%02X:%02X:%02X:%02X', header[0], header[1], header[2], header[3], header[4], header[5]) end socket = Socket.open(Socket::AF_INET, Socket::SOCK_PACKET, ETH_P_ALL) loop do buff, sockaddr = socket.recvfrom(8192) puts '送信先: ' + mac_to_s(buff, 0) puts '送信元: ' + mac_to_s(buff, 6) protocol = buff[12, 2].unpack('n')[0] puts 'プロトコル: 0x' + protocol.to_s(16) if protocol == 0x800 puts 'IPv4パケット!' buff.slice!(0..13) puts (buff[0].unpack('C')[0] >> 4) & 0x0F end end