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 */
}
```