enum Pcap::NextError
EOF = -2 # EOF or pcap_breakloop
ERROR = -1 #
TIMEOUT = 0 # should be continued
end
class Pcap::Capture
def next_ex : NextError | Packet
ret = LibPcap.pcap_next_ex(@pcap, out headp, out bytes)
NextError.from_value?(ret) || Pcap::Packet.new(headp, bytes)
end
end
pcap = Pcap::Capture.open_offline("redis-ping.cap")
15.times do
puts pcap.next_ex
end
22:36:51.327153 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [S], seq 3742863884, win 43690, length 0
22:36:51.327193 IP 127.0.0.1.6379 > 127.0.0.1.56903: Flags [SA], seq 3534198769, ack 3742863885, win 43690, length 0
22:36:51.327246 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198770, win 342, length 0
...
22:36:51.328386 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198778, win 342, length 0
EOF
EOF
EOF
EOF
EOF
pcap = Pcap::Capture.open_offline("redis-ping.cap")
loop {
case pkt = pcap.next_ex
when Pcap::Packet
puts pkt
when Pcap::NextError::TIMEOUT
# next
when Pcap::NextError::ERROR
abort "next_ex failed with code=#{pkt}"
when Pcap::NextError::EOF
break
else
abort "BUG: unexpected status: #{pkt.class}"
end
}
22:36:51.327153 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [S], seq 3742863884, win 43690, length 0
22:36:51.327193 IP 127.0.0.1.6379 > 127.0.0.1.56903: Flags [SA], seq 3534198769, ack 3742863885, win 43690, length 0
22:36:51.327246 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198770, win 342, length 0
...
22:36:51.328386 IP 127.0.0.1.56903 > 127.0.0.1.6379: Flags [A], ack 3534198778, win 342, length 0