マイペースなプログラミング日記

x86エミュレータやFPGA、WebGLにお熱なd-kamiがマイペースに書くブログ

コードその1

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