use futures::StreamExt;
use pcap::{Active, Capture, Device, Error, Packet, PacketCodec, PacketStream};
use std::error;
pub struct BoxCodec;
impl PacketCodec for BoxCodec {
type Item = Box<[u8]>;
fn decode(&mut self, packet: Packet) -> Self::Item {
packet.data.into()
}
}
fn new_stream(device: Device) -> Result<PacketStream<Active, BoxCodec>, Error> {
println!("Using device {}", device.name);
let cap = Capture::from_device(device)?
.immediate_mode(true)
.open()?
.setnonblock()?;
cap.stream(BoxCodec)
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn error::Error>> {
let device = Device::lookup()?.ok_or("no device available")?;
let mut stream = new_stream(device)?;
loop {
let data = stream.next().await.unwrap()?;
stream.capture_mut().sendpacket(data)?;
}
}