Re: How can i find my LAN IP Address using std.socket?

2024-02-18 Thread cc via Digitalmars-d-learn
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


On Windows, you can use the Win32`GetAdaptersInfo`[1] function to 
get a list of IPv4 adapters and addresses.  If you need IPv6 
addresses or other more modern features, there is the 
`GetAdaptersAddresses`[2] function, however it doesn't seem the 
necessary Windows headers (IPTypes.h / ifdef.h) have been ported 
to D for this yet.


[1] 
https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersinfo
[2] 
https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses


As I attempt to post this, I now see this thread is... 10 years 
old.  Oh well, still relevant I think.


```d
import std.string;
pragma(lib, `mingw/iphlpapi.lib`); // included with dmd

struct Adapter {
string name;
string desc;
struct IPMask {
string ip;
string mask;
}
IPMask[] addresses;
}

Adapter[] getAdapters() {
import core.sys.windows.windows;
//import core.sys.windows.nspapi;
import core.sys.windows.iptypes;
import core.sys.windows.iphlpapi;

void[] buf;
uint size = 0;
auto ret = GetAdaptersInfo(null, );
	assert(ret == ERROR_BUFFER_OVERFLOW && size > 0, "Expected 
GetAdaptersInfo to return ERROR_BUFFER_OVERFLOW to query size of 
buffer");

buf.length = size;
ret = GetAdaptersInfo(cast(IP_ADAPTER_INFO*) buf.ptr, );
assert(!ret, "GetAdaptersInfo error");

auto adpt = cast(IP_ADAPTER_INFO*) buf.ptr;

Adapter[] adapters;

while (adpt) {
scope(success) adpt = adpt.Next;

Adapter adapter;
adapter.name = adpt.AdapterName.fromStringz.idup;
adapter.desc = adpt.Description.fromStringz.idup;

IP_ADDR_STRING addr = adpt.IpAddressList;
auto paddr = 
while (paddr) {
scope(success) paddr = addr.Next;
			adapter.addresses ~= 
Adapter.IPMask(paddr.IpAddress.String.fromStringz.idup, 
paddr.IpMask.String.fromStringz.idup);

}
adapters ~= adapter;
}
return adapters;
}

void main() {
import std.stdio;
auto adapters = getAdapters();
adapters.writeln;
}
```


Re: How can i find my LAN IP Address using std.socket?

2024-02-17 Thread Forest via Digitalmars-d-learn
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


Sadly, the standard library doesn't seem to offer network 
interface enumeration.


However, if you don't mind delving into platform-specific C APIs 
that are exposed by Phobos but not mentioned in the docs ([issue 
5872](https://issues.dlang.org/show_bug.cgi?id=5872)), it can be 
done. The code I found here was enough to get me started:


https://github.com/Kripth/my-ip/blob/356e02f0/src/myip/private_.d

The key to a linux implementation was `getifaddrs()`, which can 
be found in core.sys.linux.ifaddrs.


Re: How can i find my LAN IP Address using std.socket?

2023-02-21 Thread Mike Shah via Digitalmars-d-learn

On Tuesday, 4 February 2014 at 22:31:53 UTC, Dicebot wrote:
On Tuesday, 4 February 2014 at 20:19:14 UTC, TheFlyingFiddle 
wrote:
I'm setting up a simple local network enabling me to connect 
phones to the computer through the local wi-fi. The simplest 
way i could think of to make this work without relying on an 
external server was to simply broadcast the ip and port to all 
machines in the network.(Btw by server i mean my / my project 
groups windows boxes).


So well the problem is that i need a way for the phones to 
find running servers on the LAN.


I think it is close to impossible to do in portable way. Most 
reliable approach is to get list of all configured network 
interfaces via posix functions (or via `system` call as least 
resort), filter out "lo" and broadcast message for every such 
interface. I think you can also filter only wireless interfaces 
that way relatively easily too.


Apologies that I am bumping a post that is 9 years old, but I 
recently had to do this and thought this may help beginners. In a 
way it's a hack as suggested from the second post, that you can 
connect to a known ip address (e.g. google) from a socket and 
then see the endpoints with the local and remote addresses.


```
import std.stdio;
import std.socket;

void GetIP(){
// A bit of a hack, but we'll create a connection from 
google to

// our current ip.
// Use a well known port (i.e. google) to do this
auto r = getAddress("8.8.8.8",53); // NOTE: This is 
effetively getAddressInfo

writeln(r);
// Create a socket
auto sockfd = new Socket(AddressFamily.INET,  
SocketType.STREAM);

// Connect to the google server
import std.conv;
const char[] address = r[0].toAddrString().dup;
ushort port = to!ushort(r[0].toPortString());
sockfd.connect(new InternetAddress(address,port));
// Obtain local sockets name and address
writeln(sockfd.hostName);
writeln("Our ip address: ",sockfd.localAddress);
writeln("the remote address: ",sockfd.remoteAddress);

// Close our socket
sockfd.close();
}
```



Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Dicebot
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


You can have lot of different local IP addresses on a single 
machine so question can't be answered properly. However you may 
use in `Socket.hostName` and resolve it via DNS to find IP 
machine itself currently consuders as its main pulbic IP.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Stanislav Blinov
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


Create a connection to another LAN machine with a known address 
(e.g. gateway or router), then use Socket's localAddress property 
to get your IP. You cannot really do that before establishing a 
connection, as Dicebot already mentioned.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Dicebot
On Tuesday, 4 February 2014 at 13:21:54 UTC, Stanislav Blinov 
wrote:
Create a connection to another LAN machine with a known address 
(e.g. gateway or router), then use Socket's localAddress 
property to get your IP.


Worth noting that this solution is not reliable in general either 
because your server can possibly have complicated routing 
configurations that will make, for example, LAN destination 
packets go via different network interface than WAN destination 
ones.


It is probably better to tell what high-level problem you are 
trying to solve to find most useful compromise.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread TheFlyingFiddle

On Tuesday, 4 February 2014 at 13:13:07 UTC, Dicebot wrote:
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


You can have lot of different local IP addresses on a single 
machine so question can't be answered properly. However you may 
use in `Socket.hostName` and resolve it via DNS to find IP 
machine itself currently consuders as its main pulbic IP.


This works great thanks. I just need any (working) local IP 
address so getting more then one is not an issue for me.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread TheFlyingFiddle
On Tuesday, 4 February 2014 at 13:21:54 UTC, Stanislav Blinov 
wrote:
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


Create a connection to another LAN machine with a known address 
(e.g. gateway or router), then use Socket's localAddress 
property to get your IP. You cannot really do that before 
establishing a connection, as Dicebot already mentioned.


Problem is that i don't know in what local network the server 
will be running, so this is unfortunatly not an option for me.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Stanislav Blinov
On Tuesday, 4 February 2014 at 13:31:27 UTC, TheFlyingFiddle 
wrote:


Problem is that i don't know in what local network the server 
will be running, so this is unfortunatly not an option for me.


But if that's the case, the hostname solution may as well just 
give you your loopback address. :)


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Craig Dillabaugh
On Tuesday, 4 February 2014 at 15:48:50 UTC, Vladimir Panteleev 
wrote:
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


This program will print all of your computer's IP addresses:

import std.socket;
import std.stdio;

void main()
{
foreach (addr; getAddress(Socket.hostName))
writeln(addr.toAddrString());
}

This includes IPv6 addresses. You can filter the address family 
by checking addr's addressFamily property.


I am a bit lost in anything networking related, so I ran this on 
my machine just for fun and it printed:


127.0.0.1
127.0.0.1
127.0.0.1

which based on my understanding is the local loopback address (I 
am not completely, 100% ignorant).


However if I run /sbin/ifconfig I get:

enp7s0Link encap:Ethernet  HWaddr 50:E5:49:9B:29:49
  inet addr:10.1.101.52  Bcast:10.1.101.255  
Mask:255.255.255.0

  inet6 addr: fe80::52e5:49ff:fe9b:2949/64 Scope:Link

loLink encap:Local Loopback
  inet addr:127.0.0.1  Mask:255.0.0.0
  inet6 addr: ::1/128 Scope:Host

This computer is on a network with dynamically assigned IP 
address (DHCP).

So shouldn't the 10.1.101.52 address have been reported?


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Dicebot
On Tuesday, 4 February 2014 at 16:02:33 UTC, Craig Dillabaugh 
wrote:

However if I run /sbin/ifconfig I get:

enp7s0Link encap:Ethernet  HWaddr 50:E5:49:9B:29:49
  inet addr:10.1.101.52  Bcast:10.1.101.255  
Mask:255.255.255.0

  inet6 addr: fe80::52e5:49ff:fe9b:2949/64 Scope:Link

loLink encap:Local Loopback
  inet addr:127.0.0.1  Mask:255.0.0.0
  inet6 addr: ::1/128 Scope:Host

This computer is on a network with dynamically assigned IP 
address (DHCP).

So shouldn't the 10.1.101.52 address have been reported?


It results in all addresses you hostname resolvs to. On all 
desktop linux machines /etc/hosts is configured to resolve 
hostname to localhost by default. On servers it usually 
resolves to externally accessible one.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Vladimir Panteleev
On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle 
wrote:
I'm trying to find my own ip address using std.socket with 
little success. How would i go about doing this? (It should be 
a AddressFamily.INET socket)


This program will print all of your computer's IP addresses:

import std.socket;
import std.stdio;

void main()
{
foreach (addr; getAddress(Socket.hostName))
writeln(addr.toAddrString());
}

This includes IPv6 addresses. You can filter the address family 
by checking addr's addressFamily property.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Dicebot

On Tuesday, 4 February 2014 at 16:13:33 UTC, Dicebot wrote:
It results in all addresses you hostname resolvs to. On all 
desktop linux machines /etc/hosts is configured to resolve 
hostname to localhost by default. On servers it usually 
resolves to externally accessible one.


Update: I have just checked and this is actually distro-specific 
right now. My Arch box does not have that /etc/hosts entry and 
resolves host name to whatever first configured network interface 
has. Ubuntu does have explicit host name entry in /etc/hosts 
which resolves to localhost.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Stanislav Blinov
On Tuesday, 4 February 2014 at 16:02:33 UTC, Craig Dillabaugh 
wrote:


This computer is on a network with dynamically assigned IP 
address (DHCP).

So shouldn't the 10.1.101.52 address have been reported?


Nope. In out-of-the-box simple network setups (i.e. home network 
in the form PC/laptop - router - internet) the address 
resolution won't go further than your hosts file, which in turn 
will always give you back the loopback address (more 
specifically, the address that is specified for the hostname in 
aforementioned file).


That's why both I and Dicebot mentioned there isn't any real way 
to query your local addresses without any live connection: only 
when a socket has a connection within a particular network can 
you tell your own IP address in that network. The address itself 
would depend on the network setup, your local routing 
configuration, etc. Your machine can have several network 
adaptors (ethernet boards, Wi-Fi, etc.), each configured with 
(numerous) routing setups, plus the routers they're connected to 
have their own routing setups... This can go on and on.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Craig Dillabaugh

On Tuesday, 4 February 2014 at 16:13:33 UTC, Dicebot wrote:
On Tuesday, 4 February 2014 at 16:02:33 UTC, Craig Dillabaugh 
wrote:

However if I run /sbin/ifconfig I get:

enp7s0Link encap:Ethernet  HWaddr 50:E5:49:9B:29:49
 inet addr:10.1.101.52  Bcast:10.1.101.255  
Mask:255.255.255.0

 inet6 addr: fe80::52e5:49ff:fe9b:2949/64 Scope:Link

loLink encap:Local Loopback
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host

This computer is on a network with dynamically assigned IP 
address (DHCP).

So shouldn't the 10.1.101.52 address have been reported?


It results in all addresses you hostname resolvs to. On all 
desktop linux machines /etc/hosts is configured to resolve 
hostname to localhost by default. On servers it usually 
resolves to externally accessible one.


Thanks.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread TheFlyingFiddle

On Tuesday, 4 February 2014 at 13:24:59 UTC, Dicebot wrote:
On Tuesday, 4 February 2014 at 13:21:54 UTC, Stanislav Blinov 
wrote:
Worth noting that this solution is not reliable in general 
either because your server can possibly have complicated routing 
configurations that will make, for example, LAN destination 
packets go via different network interface than WAN destination 
ones.


It is probably better to tell what high-level problem you are 
trying to solve to find most useful compromise.


I'm setting up a simple local network enabling me to connect 
phones to the computer through the local wi-fi. The simplest way 
i could think of to make this work without relying on an external 
server was to simply broadcast the ip and port to all machines in 
the network.(Btw by server i mean my / my project groups windows 
boxes).


So well the problem is that i need a way for the phones to find 
running servers on the LAN.


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Johannes Pfau
Am Tue, 04 Feb 2014 16:19:08 +
schrieb Stanislav Blinov stanislav.bli...@gmail.com:

 On Tuesday, 4 February 2014 at 16:02:33 UTC, Craig Dillabaugh 
 wrote:
 
  This computer is on a network with dynamically assigned IP 
  address (DHCP).
  So shouldn't the 10.1.101.52 address have been reported?
 
 Nope. In out-of-the-box simple network setups (i.e. home network 
 in the form PC/laptop - router - internet) the address 
 resolution won't go further than your hosts file, which in turn 
 will always give you back the loopback address (more 
 specifically, the address that is specified for the hostname in 
 aforementioned file).
 
 That's why both I and Dicebot mentioned there isn't any real way 
 to query your local addresses without any live connection: only 
 when a socket has a connection within a particular network can 
 you tell your own IP address in that network. The address itself 
 would depend on the network setup, your local routing 
 configuration, etc. Your machine can have several network 
 adaptors (ethernet boards, Wi-Fi, etc.), each configured with 
 (numerous) routing setups, plus the routers they're connected to 
 have their own routing setups... This can go on and on.

As a last resort there are always OS specific APIs to iterate network
interfaces. For example, for linux:
http://man7.org/linux/man-pages/man3/getifaddrs.3.html

(Of course this doesn't tell you at all whether a local IP-address is
actually routable. And you probably have to figure out if you got
a link local / ULA IPv6 or a global one)


Re: How can i find my LAN IP Address using std.socket?

2014-02-04 Thread Dicebot
On Tuesday, 4 February 2014 at 20:19:14 UTC, TheFlyingFiddle 
wrote:
I'm setting up a simple local network enabling me to connect 
phones to the computer through the local wi-fi. The simplest 
way i could think of to make this work without relying on an 
external server was to simply broadcast the ip and port to all 
machines in the network.(Btw by server i mean my / my project 
groups windows boxes).


So well the problem is that i need a way for the phones to find 
running servers on the LAN.


I think it is close to impossible to do in portable way. Most 
reliable approach is to get list of all configured network 
interfaces via posix functions (or via `system` call as least 
resort), filter out lo and broadcast message for every such 
interface. I think you can also filter only wireless interfaces 
that way relatively easily too.