get_local_ip/
lib.rs

1use std::io::Result as IoResult;
2use std::net::UdpSocket;
3
4pub mod cmd;
5
6#[derive(Debug)]
7pub struct Ip {
8    pub local: String,
9    pub network: String,
10}
11
12#[derive(Debug)]
13pub struct Host {
14    pub ip: String,
15    pub port: String,
16}
17
18impl Host {
19    pub fn get(self) -> String {
20        format!("{}:{}", self.ip, self.port)
21    }
22}
23
24pub fn ifconfig() -> IoResult<Ip> {
25    Ok(cmd::exec::ifconfig().unwrap())
26}
27
28pub fn network() -> Option<Host> {
29    let network = ifconfig().unwrap().network;
30    let host = format!("{}:{}", network, 0);
31    let socket = UdpSocket::bind(host).unwrap();
32    Some(Host{
33        ip: socket.local_addr().unwrap().ip().to_string(),
34        port: socket.local_addr().unwrap().port().to_string(),
35    })
36}
37
38pub fn local() -> Option<Host> {
39    let local = ifconfig().unwrap().local;
40    let host = format!("{}:{}", local, 0);
41    let socket = UdpSocket::bind(host).unwrap();
42    Some(Host{
43        ip: socket.local_addr().unwrap().ip().to_string(),
44        port: socket.local_addr().unwrap().port().to_string(),
45    })
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_ifconfig() {
54        assert!(ifconfig().is_ok());
55    }
56
57    #[test]
58    fn test_network() {
59        assert!(network().is_some())
60    }
61
62    #[test]
63    fn test_local() {
64        assert!(local().is_some())
65    }
66}