IO-Socket-TIPC
view release on metacpan or search on metacpan
lib/IO/Socket/TIPC/Sockaddr.pm view on Meta::CPAN
package IO::Socket::TIPC::Sockaddr;
use strict;
use warnings;
use Carp;
use Scalar::Util qw(looks_like_number);
use Exporter;
our @ISA = qw(Exporter);
=head1 NAME
IO::Socket::TIPC::Sockaddr - struct sockaddr_tipc class
=head1 SYNOPSIS
use IO::Socket::TIPC::Sockaddr;
=head1 DESCRIPTION
TIPC Sockaddrs are used with TIPC sockets, to specify local or remote
endpoints for communication. They are used in the B<bind>(),
B<connect>(), B<sendto>() and B<recvfrom>() calls.
Sockaddrs can be broken down into 3 address-types, I<"name">,
I<"nameseq"> and I<"id">. the I<Programmers_Guide.txt> (linked to in
B<REFERENCES>) explains the details much better than I ever could, I suggest
reading it before trying to use this module. Also, the B<EXAMPLES> section
is useful for getting a feel for how this module works.
=cut
# Virtually this whole file is just hand-holding for the caller's benefit.
#
# You can pass it strings like Id => "<a.b.c:d>", or Nameseq => "{a,b,c}".
# You can pass it the pieces, like AddrType => 'name', Type => 4242, Instance => 1.
# You can pass it a mixture of the two, like Id => "<a.b.c>", Ref => 8295.
# You can even omit the AddrType parameter, it'll guess from the other args.
# Passing the pieces (and specifying the AddrType) is the most efficient way to
# use this module, but not the most convenient, so other options exist.
sub divine_address_type {
my $args = shift;
# try to figure out what type of address this is.
if(exists($$args{Type})) {
if(exists($$args{Instance})) {
$$args{AddrType} = 'name';
}
elsif(exists($$args{Lower})) {
$$args{AddrType} = 'nameseq';
$$args{Upper} = $$args{Lower}
unless exists $$args{Upper};
}
elsif(exists($$args{Upper})) {
$$args{AddrType} = 'nameseq';
$$args{Lower} = $$args{Upper}
unless exists $$args{Lower};
}
} elsif(exists($$args{Ref})) {
$$args{AddrType} = 'id';
} else {
croak("could not guess AddrType - please specify it");
}
return 1;
}
my %valid_args = (
'AddrType' => [qw(id name nameseq)], # 'id', 'name', or 'nameseq'
'Scope' => [qw( name nameseq)], # TIPC_*_SCOPE, for binding, how far to advertise a name
'Ref' => [qw(id )], # <a.b.c:D>
'Id' => [qw(id )], # <A.B.C> (string or uint32) or <A.B.C:D> (string)
'Zone' => [qw(id )], # <A.b.c:d>
'Cluster' => [qw(id )], # <a.B.c:d>
'Node' => [qw(id )], # <a.b.C:d>
'Name' => [qw( name )], # {A,B} (string)
'Type' => [qw( name nameseq)], # {A,b} or {A,b,c}
'Instance' => [qw( name )], # {a,B}
'Domain' => [qw( name )], # tipc_addr, connect/sendto, how far to search for a name
'Lower' => [qw( nameseq)], # {a,B,c}
( run in 0.789 second using v1.01-cache-2.11-cpan-524268b4103 )