[ace-users] question on ACE_INET_Addr
Andre Kostur
akostur at incognito.com
Thu Aug 2 14:02:39 CDT 2007
I've worked with the IPv6 stuff in ACE, and using the
ACE_USES_IPV4_IPV6_MIGRATION (plus ipv6=1 in the features file) was
enough for my code to work on a v4-only host. However, I haven't used
the Proactor yet.
-----Original Message-----
From: ace-users-bounces at cse.wustl.edu
[mailto:ace-users-bounces at cse.wustl.edu] On Behalf Of Steve Huston
Sent: Thursday, August 02, 2007 11:34 AM
To: 'Phil Mesnier'; 'Premkumar P'
Cc: ace-users at cse.wustl.edu
Subject: Re: [ace-users] question on ACE_INET_Addr
Hi folks,
Phil, your patch looks correct - as long as it works for Premkumar ;-)
I think, if I've understood this correctly, that the issue arose
because Premkumar built on a system containing all the IPv6 support
and ran on a different system that does not have IPv6 support. Or, at
least, one that has the support there but no IPv6 configured, so it's
essentially an IPv4 box.
-Steve
--
Steve Huston, Riverace Corporation
Would you like ACE to run great on your platform?
See http://www.riverace.com/sponsor.htm
> -----Original Message-----
> From: Phil Mesnier [mailto:mesnier_p at ociweb.com]
> Sent: Thursday, August 02, 2007 10:12 AM
> To: Premkumar P
> Cc: ace-users at cse.wustl.edu; shuston at riverace.com
> Subject: Re: [ace-users] question on ACE_INET_Addr
>
>
> Premkumar P wrote:
> > hi,
> >
> > thankx for your help .. i will use the same in set function.
> >
> > I think a potential problem is that some functions,
> such as the set
> > function relied upon by the ctor modified below, are
> intended to let the
> > OS make the IPv4/IPv6 call if AF_UNSPEC is passed as
> the address family.
> > By using determine_type() to specify AF_INET or
> AF_INET6, we might end
> > up forcing something into an incorrect family. For
> example, we are
> > setting up an ACE_INET_Addr to contain the address of
> an external host
> > that really does not have IPv6, but with the local
> configuration,
> > determine_type() returns AF_INET6, then set() will fail
> because the
> > foreign address that should become IPv4 instead yields IPv6.
> >
> > cant really understand the problem you are talking about !
> it would of
> > great help if can 'expand it a bit'.
> >
>
> OK. ACE_INET_Addr has several set() methods, at least one of
> which takes
> an optional address family parameter. The default value for this
> parameter is AF_UNSPEC, meaning "I don't care what address family
you
> use." Passing either AF_INET or AF_INET6 means "use this
> address family
> or fail." Thus using determine_type() to select either AF_INET or
> AF_INET6 may cause a failure where otherwise one might not happen.
> Consider that you are on a host with IPv6 support enabled,
> and you want
> to create an ACE_INET_Addr (1234,"foo.bar.baz") where
> foo.bar.baz is some
> hostname. In your environment, foo.bar.baz resolves to only a
> single IPv4
> address. Using an address family of AF_UNSPEC, the set
> (unsigned short,
> char[],...) method will initialize the address with an IPv4
> address. If
> the address family is pre-determined to be AF_INET6, then the set
> function will fail.
>
> > will there be any problem if i make this change in
> ACE_INET_Addr::set
> > function, if that is the case i have
> > to look for a different solution, as it is critical "i
> don't break" any
> > functionality by making changes without understanding
> > the effect of it !!!!
> >
>
> Do this. Revert your change to INET_Addr.cpp and try this:
> Index: INET_Addr.cpp
> ===================================================================
> --- INET_Addr.cpp (revision 79177)
> +++ INET_Addr.cpp (working copy)
> @@ -331,6 +331,10 @@
> struct addrinfo *res = 0;
> int error = 0;
> ACE_OS::memset (&hints, 0, sizeof (hints));
> +# if defined (ACE_USES_IPV4_IPV6_MIGRATION)
> + if (address_family == AF_UNSPEC && !ACE::ipv6_enabled())
> + address_family = AF_INET;
> +# endif /* ACE_USES_IPV4_IPV6_MIGRATION */
> if (address_family == AF_UNSPEC || address_family == AF_INET6)
> {
> hints.ai_family = AF_INET6;
>
> Let me know how this works.
>
> Now, can you answer a question for me? I am trying to figure
> out how your
> error condition arose in the first place. From what I understand,
you
> have an ACE library built with IPv6 support. This means that all the
> headers are available to define such things as AF_INET6,
> sockaddr_in6,
> etc. It also means that there is system library support for
> calls such as
> getaddrinfo() that can return IPv6 addresses. But when that
> address is
> supplied to the acceptor (used by the reactor notify pipe) it is
only
> then that it is rejected?
>
> That sounds like an even finer level of granularity than the current
> ACE_NAS_IPV6 allows. It sounds more like, there are IPv6
> definitions, but
> no runtime support. Ugh.
>
> --
> Phil Mesnier
> Principal Software Engineer, http://www.ociweb.com
> Object Computing, Inc. +01.314.579.0066
>
_______________________________________________
ace-users mailing list
ace-users at mail.cse.wustl.edu
http://mail.cse.wustl.edu/mailman/listinfo/ace-users
More information about the Ace-users
mailing list