|
Packit |
437b5e |
local p = require "posix"
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
if p.SOCK_RAW and p.SO_BINDTODEVICE then
|
|
Packit |
437b5e |
-- Open raw socket
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local fd, err = p.socket(p.AF_INET, p.SOCK_RAW, p.IPPROTO_ICMP)
|
|
Packit |
437b5e |
assert(fd, err)
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
-- Optionally, bind to specific device
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local ok, err = p.setsockopt(fd, p.SOL_SOCKET, p.SO_BINDTODEVICE, "wlan0")
|
|
Packit |
437b5e |
assert(ok, err)
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
-- Create raw ICMP echo (ping) message
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local data = string.char(0x08, 0x00, 0x89, 0x98, 0x6e, 0x63, 0x00, 0x04, 0x00)
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
-- Send message
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local ok, err = p.sendto(fd, data, { family = p.AF_INET, addr = "8.8.8.8", port = 0 })
|
|
Packit |
437b5e |
assert(ok, err)
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
-- Read reply
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
local data, sa = p.recvfrom(fd, 1024)
|
|
Packit |
437b5e |
assert(data, sa)
|
|
Packit |
437b5e |
|
|
Packit |
437b5e |
if data then
|
|
Packit |
437b5e |
print("Received ICMP message from " .. sa.addr)
|
|
Packit |
437b5e |
end
|
|
Packit |
437b5e |
end
|