[zeromq-dev] Zyre ipaddress in Hello message
Pieter Hintjens
ph at imatix.com
Wed Jan 1 16:15:33 CET 2014
Looking at this, it's non-trivial. Here's more explanation and sample
code: http://bert-hubert.blogspot.fr/2012/10/on-binding-datagram-udp-sockets-to-any.html
I'm thinking that we could make a portable alternative, which is to
create multiple UDP sockets, one for each interface. Rather than bind
to INADDR_ANY, we could bind each socket to a specific interface, and
then it's easy to get the ipaddress for each socket. It's easy to poll
on multiple sockets.
Thoughts?
-Pieter
On Wed, Jan 1, 2014 at 4:01 PM, Pieter Hintjens <ph at imatix.com> wrote:
> On Sat, Dec 28, 2013 at 11:25 AM, Arnaud Loonstra <arnaud at sphaero.org> wrote:
>
>> Because zbeacon passes the ipaddress on to the agent which the zyre_node
>> uses...
>
> Right... HELLO message isn't the beacon, my mistake. The node will
> connect using the HELLO's ipaddress only if it didn't already get a
> beacon from that node.
>
> You're right that the ipaddress will be wrong in cases with multiple
> interfaces. This could be improved... right now the Zyre internals
> just don't allow for that. It should pick-up the hostname dynamically
> each time it sends HELLO.
>
> Alternatively, as you say, it could get the originating IP address of
> each HELLO message. That is more work. The libzmq API doesn't provide
> that directly (we could extract it at authentication time, from
> ZMQ/4.0 and later).
>
> So option 1 then. The flow is, A gets beacon from B, and then connects
> to B and sends HELLO. B receives HELLO from A, and connects back to A.
> So A knows what address it received a beacon on.
>
> It seems we need to use recvmsg() instead of recvfrom(). There's an
> example here:
>
> http://stackoverflow.com/questions/5281409/get-destination-address-of-a-received-udp-packet
>
> So then, zbeacon would update its hostname property after each recv,
> and the caller could use this to construct an accurate HELLO message.
>
> -Pieter
More information about the zeromq-dev
mailing list