Thread overview
sockaddr_in and InternetAddress
May 29, 2015
Andre Kostur
May 29, 2015
Adam D. Ruppe
May 29, 2015
Vladimir Panteleev
May 29, 2015
Andre Kostur
May 29, 2015
I'm looking for one of two things:

1) If I have a sockaddr_in, how do I get it into an InternetAddress?   I can do it with sufficient handwaving using bigEndianToNative and such (pulling out the 4-byte address in there), but I was expecting an easier/shorter method to get the sockaddr_in into an InternetAddress (after all, it's exactly what an InternetAddress is holding internally anyway)?

2) If it is agreed that there should be a shorter way, I'm willing to write the code, but would need a little guidance as to where would be the appropriate place to put the code (New overload to parseAddress?  New constructor for InternetAddress?)

And... a similar issue for sockaddr_in6 and Internet6Address (although this one's easier since you don't need to deal with the endianness issue).
May 29, 2015
I would add it as a new constructor to InternetAddress.

In the mean time, you could work around the lack of it by making a new subclass of InternetAddress that sets the member with your constructor. Like:

class MyInternetAddress : InternetAddress {
   this(sockaddr_in addr) {
      this.sin = addr;
   }
}


and I think that will work. (Looking at the source, the sin member is protected which means a subclass can get at it.)

Then you just pass it everywhere InternetAddress is expected and it ought to just work.
May 29, 2015
On Friday, 29 May 2015 at 00:08:10 UTC, Andre Kostur wrote:
> I'm looking for one of two things:
>
> 1) If I have a sockaddr_in, how do I get it into an InternetAddress?

First of all, you may not actually need an InternetAddress. Modern code working with addresses should be address-agnostic, so it should take an Address instead. Ideally, you should avoid doing anything address-family-specific - then, it will work with any address family, incl. any introduced in the future.

You could:

- Create an UnknownAddressReference which uses a pointer to your sockaddr_in.

- Create an InternetAddress, then copy the address over its "name" property.

> 2) If it is agreed that there should be a shorter way, I'm willing to write the code, but would need a little guidance as to where would be the appropriate place to put the code (New overload to parseAddress?  New constructor for InternetAddress?)

A new constructor for InternetAddress won't hurt.

May 29, 2015
On 2015-05-28 11:10 PM, Vladimir Panteleev wrote:
> On Friday, 29 May 2015 at 00:08:10 UTC, Andre Kostur wrote:
>> I'm looking for one of two things:
>>
>> 1) If I have a sockaddr_in, how do I get it into an InternetAddress?
>
> First of all, you may not actually need an InternetAddress. Modern code
> working with addresses should be address-agnostic, so it should take an
> Address instead. Ideally, you should avoid doing anything
> address-family-specific - then, it will work with any address family,
> incl. any introduced in the future.

Generally speaking, sure.  But I live down at the protocol layers of networking where I do need to be aware of whether I'm using IPv4 or IPv6.

> You could:
>
> - Create an UnknownAddressReference which uses a pointer to your
> sockaddr_in.
>
> - Create an InternetAddress, then copy the address over its "name"
> property.

Seems inconvenient to construct then copy over an object when I have the data ready at the time of construction.

>> 2) If it is agreed that there should be a shorter way, I'm willing to
>> write the code, but would need a little guidance as to where would be
>> the appropriate place to put the code (New overload to parseAddress?
>> New constructor for InternetAddress?)
>
> A new constructor for InternetAddress won't hurt.

Done (for both InternetAddress and Internet6Address), pull request is in progress.

Thanks for the input!  (And to Adam too...)