Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 原始套接字是否有安全接口?_Linux_Sockets_Network Programming_Rust - Fatal编程技术网

Linux 原始套接字是否有安全接口?

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

据说唯一的办法就是使用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);
  }
}
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
,我已经搜索过了,找不到它。正在被完全移除吗?如果是,我必须使用什么来代替?