Linux 原始套接字是否有安全接口?
据说唯一的办法就是使用libc:Linux 原始套接字是否有安全接口?,linux,sockets,network-programming,rust,Linux,Sockets,Network Programming,Rust,据说唯一的办法就是使用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
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);
}
}
extern板条箱libc;
外置板条箱;
使用libc:{c_int,c_void,socket,AF_INET,sockaddr_storage};
使用native::io::net::sockaddr\u to\u addr;
使用std::io::net::ip::SocketAddr;
静态SOCK_RAW:c_int=3;
静态IPPROTO_ICMP:c_int=1;
fn recvfrom(&'buf mut[u8],SocketAddress){
让mut-storage:sockaddr_-storage=unsafe{std::mem::init()};
让storagep=&mut存储为*mut uu作为*mut libc::sockaddr;
让mut addrlen=std::mem::size_of:()作为libc::socklen_t;
让bytes=unsafe{libc::recvfrom(sock,
buf.as_mut_ptr()as*mut c_void,
buf.len()作为u64,
0,storagep,&mut addrlen)};
(buf.mut_slice_to(字节作为uint),
sockaddr_to_addr(&storage,addrlen as uint).unwrap())
}
fn main(){
let handle=unsafe{socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)};
println!(“{}”,句柄);
设mut bufferator=[0,…2048];
环路{
let(buf,from)=recvfrom(句柄,缓冲器.as_mut_slice());
println!(“from{},数据:\n{}”,from,buf);
}
}
但这是一年前写的,所以事情可能已经改变了 一般来说,任意C代码都不可能有一个安全的接口,因为不能保证C代码不会做安全不允许的事情。尽管只是一种惯例,但在锈地里,许多以“raw”为名的东西都有不安全的语义
您可以做的是用锈迹代码包装原始C代码,以确保C代码永远不会进入违反程序安全性的状态。这就是类似于或的项目的构造方式。据我所知,ICMP套接字没有包装器。还有一个问题。上面的代码很旧,所以我将其转换为与最新版本兼容。现在,我不知道如何处理'src/main.rs:3:5:3:31错误:未解析的导入
std::net::sockaddr\u to\u addr
。在std::net
[E0432]中没有sockaddr\u to\u addr
,我已经搜索过了,找不到它。正在被完全移除吗?如果是,我必须使用什么来代替?