memo.log

技術情報の雑なメモ

RubyでEtherIPパケットを作るメモ書き(RAWソケットで生データを書き込む)

require "socket"

# EtherIPヘッダも含んでそれらも含めた上側のデータ
def trans_data
  # IP Header: 20Byte
  # MAC Header: 14Byte
  # EtherIP Header: 2Byte
  # とりあえず、EtherIPヘッダ+自然に生成されたEtherヘッダ+IPヘッダをベタで。
  bynary_data =
    0x30000ab1a91e677a0a2b383bbb0a080045000014d2b84000ff61e09aac1f0bf408080808.to_s(2).rjust(36 * 8, "0")

  data_byte_arr = bynary_data.scan(/.{1,8}/)
  data_byte_arr.map! { |byte| byte.to_i(2).chr } # TO ASCII
  data_byte_arr.join
end

# 以下により、Etherヘッダ+IPヘッダ(TypeはEtherIP)が入る
sock = Socket.new(
  Socket::AF_INET,
  Socket::SOCK_RAW, # TCP とか UDP とかではなく、IPヘッダ以上は自分で書くことができる?
  97 # EtherIP
)

sock.bind(Socket.sockaddr_in(nil, "172.31.11.244"))
sock.send(trans_data, 0, Socket.sockaddr_in(nil, "8.8.8.8"))

できあがるデータ

f:id:kuredev:20210111010429p:plain