Skip to content

Instantly share code, notes, and snippets.

@hax0r31337
Created October 25, 2024 19:19
Show Gist options
  • Select an option

  • Save hax0r31337/6a98ba1d067a6d8d16fca7736dcae99b to your computer and use it in GitHub Desktop.

Select an option

Save hax0r31337/6a98ba1d067a6d8d16fca7736dcae99b to your computer and use it in GitHub Desktop.
Rust SOCK_RAW Linux raw sockets UDP example
use std::os::fd::AsRawFd;
use nix::sys::socket;
fn main() -> Result<(), std::io::Error> {
let sock = socket::socket(
socket::AddressFamily::Inet,
socket::SockType::Raw,
socket::SockFlag::empty(),
socket::SockProtocol::Udp,
)?;
unsafe {
let opt: libc::c_int = 1;
let val = libc::setsockopt(
sock.as_raw_fd(),
libc::IPPROTO_IP,
libc::IP_HDRINCL,
&opt as *const _ as *const libc::c_void,
std::mem::size_of::<libc::c_int>() as u32,
);
if val < 0 {
return Err(std::io::Error::last_os_error());
}
}
let payload = b"Hello, world!";
let dst_addr = socket::SockaddrIn::new(8, 9, 6, 4, 999);
let src_addr = socket::SockaddrIn::new(127, 0, 0, 1, 1234);
let pk = {
let builder =
etherparse::PacketBuilder::ipv4(src_addr.ip().octets(), dst_addr.ip().octets(), 255)
.udp(src_addr.port(), dst_addr.port());
let mut vec = Vec::with_capacity(builder.size(payload.len()));
if let Err(err) = builder.write(&mut vec, payload) {
return Err(std::io::Error::new(std::io::ErrorKind::Other, err));
}
vec
};
socket::sendto(sock.as_raw_fd(), &pk, &dst_addr, socket::MsgFlags::empty())?;
Ok(())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment