Addrinfo#== behaves oddly
It appears as if Addrinfo is using object identity.
Addrinfo#== doesn't appear to work as one might expect, given the same instantiation:
> irb 2.4.0 :001 > require 'socket' => true 2.4.0 :002 > Addrinfo.tcp('0.0.0.0', 1234) == Addrinfo.tcp('0.0.0.0', 1234) => false 2.4.0 :003 > a = Addrinfo.tcp('0.0.0.0', 1234) => #<Addrinfo: 0.0.0.0:1234 TCP> 2.4.0 :004 > a == a => true 2.4.0 :005 >
Updated by akr (Akira Tanaka) about 5 years ago
- Status changed from Open to Feedback
It is difficult compare Addrinfo objects precisely if not impossible.
Using Addrinfo#inspect as addrinfo_eql.diff is fragile.
Addrinfo is basically struct addrinfo which contains struct sockaddr.
Byte-to-byte comparison may not work.
struct sockaddr can have padding which makes byte-to-byte comparison different but
means same address.
Also, ai_family may be AF_UNSPEC which is same meaning to AF_INET or AF_INET6.
I guess there are more concerns.
The critical point is that Ruby can not know all protocols supported by OS.
Since struct sockaddr depends to a protocol, we can not compare all socket address properly.
Updated by shyouhei (Shyouhei Urabe) about 4 years ago
ioquatix (Samuel Williams) wrote:
Doing a binary comparison would be acceptable.
I don't think so. As Akira already pointed out,
- Addrinfo have "padding" bits which are not stable. Binary comparison might fail at that point.
- Addrinfo can handle arbitrary socket addresses, not only internet things. Which makes it impossible to tell which bit is a padding and which is not.
Updated by naruse (Yui NARUSE) about 3 years ago
We discussed about this in developer meeting.
This feature has some difficulty in spec for example padding, unknown type (other than AF_INET, AF_INET6, AF_UNIX, and so on), which should it use for the comparison.
Though such difficulty, we can define a spec only for AF_INET and AF_INET6 if there's concrete use case.