gpt4 book ai didi

linux - 是否有原始套接字的安全接口(interface)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:03 24 4
gpt4 key购买 nike

Here据说唯一的办法就是使用libc:

extern crate libc;
extern crate native;
use libc::{c_int, c_void, socket, AF_INET, sockaddr_storage};
use native::io::net::sockaddr_to_addr;
use std::io::net::ip::SocketAddr;
static SOCK_RAW: c_int = 3;
static IPPROTO_ICMP: c_int = 1;

fn recvfrom<'buf>(sock: c_int, buf: &'buf mut [u8]) -> (&'buf mut [u8], SocketAddr) {
let mut storage: sockaddr_storage = unsafe { std::mem::init() };
let storagep = &mut storage as *mut _ as *mut libc::sockaddr;
let mut addrlen = std::mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t;

let bytes = unsafe { libc::recvfrom(sock,
buf.as_mut_ptr() as *mut c_void,
buf.len() as u64,
0, storagep, &mut addrlen) };

(buf.mut_slice_to(bytes as uint),
sockaddr_to_addr(&storage, addrlen as uint).unwrap())
}

fn main() {
let handle = unsafe { socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) };
println!("{}", handle);
let mut bufferator = [0, ..2048];
loop {
let (buf, from) = recvfrom(handle, bufferator.as_mut_slice());
println!("from {}, data:\n{}", from, buf);
}
}

但是这是一年前写的,所以事情可能已经改变了?

最佳答案

一般来说,对于任意 C 代码不存在安全接口(interface),因为 C 代码不能保证不做安全 Rust 不允许的事情。尽管只是约定俗成,但 Rust 领域中许多在名称中说“原始”的东西都具有不安全的语义。

您可以做的是用 Rust 代码包装原始 C 代码,以确保 C 代码永远不会进入违反程序安全的状态。这就是 TcpStream 这样的项目或 UdpSocket被 build 。据我所知,没有用于 ICMP 套接字的包装器。

关于linux - 是否有原始套接字的安全接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33714116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com