1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
#![allow(clippy::print_literal)]
extern crate procfs;
use procfs::process::{FDTarget, Stat};
use std::collections::HashMap;
fn main() {
// get all processes
let all_procs = procfs::process::all_processes().unwrap();
// build up a map between socket inodes and processes:
let mut map: HashMap<u64, Stat> = HashMap::new();
for p in all_procs {
let process = p.unwrap();
if let (Ok(stat), Ok(fds)) = (process.stat(), process.fd()) {
for fd in fds {
if let FDTarget::Socket(inode) = fd.unwrap().target {
map.insert(inode, stat.clone());
}
}
}
}
// get the tcp table
let tcp = procfs::net::tcp().unwrap();
let tcp6 = procfs::net::tcp6().unwrap();
println!(
"{:<26} {:<26} {:<15} {:<8} {}",
"Local address", "Remote address", "State", "Inode", "PID/Program name"
);
for entry in tcp.into_iter().chain(tcp6) {
// find the process (if any) that has an open FD to this entry's inode
let local_address = format!("{}", entry.local_address);
let remote_addr = format!("{}", entry.remote_address);
let state = format!("{:?}", entry.state);
if let Some(stat) = map.get(&entry.inode) {
println!(
"{:<26} {:<26} {:<15} {:<12} {}/{}",
local_address, remote_addr, state, entry.inode, stat.pid, stat.comm
);
} else {
// We might not always be able to find the process assocated with this socket
println!(
"{:<26} {:<26} {:<15} {:<12} -",
local_address, remote_addr, state, entry.inode
);
}
}
}
|