On Thursday, 21 April 2022 at 07:20:30 UTC, dangbinghoo wrote:
On Thursday, 21 April 2022 at 07:04:18 UTC, Alexander Zhirov wrote:
I want to get the IP address of the network interface. There is both a wireless interface and a wired one. Is it possible, knowing the name of the network interface, to get its IP address?

```d
        import core.sys.posix.sys.ioctl;
        import core.sys.posix.arpa.inet;
        
        import core.stdc.string;
        import core.stdc.stdio;
        import core.stdc.errno;
        import core.sys.posix.stdio;
        import core.sys.posix.unistd;
        
        string ip;

        
        int get(string if_name)
        {
                int s = socket(AF_INET, SOCK_DGRAM, 0);
                if (s < 0) {
                        fprintf(stderr, "Create socket failed!errno=%d", errno);
                        return -1;
                }
        
                ifreq ifr;
                uint nIP, nNetmask, nBroadIP;

                strcpy(ifr.ifr_name.ptr, std.string.toStringz(if_name));
                try {
                        if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
                                return -2;
                        }
                }
                catch (Exception e) {
                        writeln("Error operation on netif " ~ if_name);
                        return -2;
                }
memcpy(macaddr.ptr, cast(char *)ifr.ifr_hwaddr.sa_data.ptr, 6);
        
                if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
                        nIP = 0;
                }
                else {
                        nIP = *cast(uint*)(&ifr.ifr_broadaddr.sa_data[2]);
                        ip = fromStringz(inet_ntoa(*cast(in_addr*)&nIP)).idup;
                }
       }

```

PS:

    ```d
    //handle binding to net/if.h
    struct ifmap
    {
        c_ulong mem_start;
        c_ulong mem_end;
        ushort base_addr;
        ubyte irq;
        ubyte dma;
        ubyte port;
        /* 3 bytes spare */
    }

    struct ifreq {
        private union ifr_ifrn_ {
                char[IFNAMSIZ] ifrn_name; /* if name, e.g. "en0" */   
        }
        ifr_ifrn_ ifr_ifrn;

        private union ifr_ifru_ {
                sockaddr ifru_addr;
                sockaddr ifru_dstaddr;
                sockaddr ifru_broadaddr;
                sockaddr ifru_netmask;
                sockaddr ifru_hwaddr;
                short   ifru_flags;
                int     ifru_ivalue;
                int     ifru_mtu;
                ifmap ifru_map;
                byte[IFNAMSIZ] ifru_slave;      /* Just fits the size */
                byte[IFNAMSIZ] ifru_newname;
                byte * ifru_data;
        }
        ifr_ifru_ ifr_ifru;

// NOTE: alias will not work : alias ifr_ifrn.ifrn_name ifr_name; @property ref ifr_name() { return ifr_ifrn.ifrn_name; } /* interface name */ @property ref ifr_hwaddr() { return ifr_ifru.ifru_hwaddr; } /* MAC address */ @property ref ifr_addr() { return ifr_ifru.ifru_addr; } /* address */ @property ref ifr_dstaddr() { return ifr_ifru.ifru_dstaddr; } /* other end of p-p lnk */ @property ref ifr_broadaddr() { return ifr_ifru.ifru_broadaddr; } /* broadcast address */ @property ref ifr_netmask() { return ifr_ifru.ifru_netmask; } /* interface net mask */ @property ref ifr_flags() { return ifr_ifru.ifru_flags; } /* flags */ @property ref ifr_metric() { return ifr_ifru.ifru_ivalue; } /* metric */ @property ref ifr_mtu() { return ifr_ifru.ifru_mtu; } /* mtu */ @property ref ifr_map() { return ifr_ifru.ifru_map; } /* device map */ @property ref ifr_slave() { return ifr_ifru.ifru_slave; } /* slave device */ @property ref ifr_data() { return ifr_ifru.ifru_data; } /* for use by interface */ @property ref ifr_ifindex() { return ifr_ifru.ifru_ivalue; } /* interface index */ @property ref ifr_bandwidth() { return ifr_ifru.ifru_ivalue; } /* link bandwidth */ @property ref ifr_qlen() { return ifr_ifru.ifru_ivalue; } /* queue length */ @property ref ifr_newname() { return ifr_ifru.ifru_newname; } /* New name */
    }

```

Reply via email to