=head1 NAME Net::SIP::Leg - Wrapper around Socket for sending and receiving SIP packets =head1 SYNOPSIS my $leg = Net::SIP::Leg->new( addr => '192.168.0.2' ); $leg->deliver( $packet, '192.168.0.5:5060' ); =head1 DESCRIPTION A B wraps the socket which is used to send and receive packets. It provides ways to strip B header from incoming packets, to add B header to outgoing packets and to add B header while forwarding. It's usually not used directly, but from L. =head1 CONSTRUCTOR =over 4 =item new ( %ARGS ) The constructor creates a new object based on the hash %ARGS. The following keys are used from %ARGS: =over 8 =item sock The socket as IO::Socket::INET object. C, C and C will be determined from this object and not from %ARGS. =item addr The local address of the socket. If this is given but no port it will extract port from addr, if it's in the format C<< host:port >>. =item port The port of the socket. Defaults to 5060. =item proto The connection protocol, e.g. 'tcp' or 'udp'. Defaults to 'udp'. =item contact Optional contact information which will be added as B header to outgoing requests. If not given it will be created based on C, C and C. =back If no socket is given with C it will be created based on C, C and C. If this fails the constructur will C<< die() >>. The constructor will creeate a uniq branch tag for this leg. =back =head1 METHODS =over 4 =item forward_incoming ( PACKET ) Modifies the L PACKET in-place for forwarding, e.g strips top B header in responses, adds B parameter to top B header in requests, handles the difference between forwarding of requests to strict or loose routes and inserts B header in requests. =item forward_outgoing ( PACKET, LEG_IN ) Similar to B, but will be called on the outgoing leg. LEG_IN is the L, where the packet came in (and where B was called). Will add B header and remove itself from B. =item deliver ( PACKET, ADDR, [ CALLBACK ] ) Delivers L PACKET through the leg C<$self> to ADDR, which is C<< "ip:port" >>. Usually this method will be call from within L. If the packet was received by the other end (which is only possible to say if a reliable protocol, e.g. 'tcp' was used) it will call CALLBACK if provided. See B in L for the format of callbacks. If the packet could not be delivered CALLBACK will be invoked with the appropriate errno (C<$!>). While delivering requests it adds a B header. =item receive Reads a packet from the socket and returns the L PACKET and the senders ADDR as C<< "ip:port" >>. If reading failed will return C<()>. =item check_via ( PACKET ) Returns TRUE if the top B header in the L PACKET contains the B-tag from C<$self>, otherwise FALSE. Used to check if the response came in through the same leg the response was send. =item can_deliver_to ( ADDR|%SPEC ) Returns TRUE if the leg can deliver address specified by ADDR or %SPEC. ADDR is a hostname which can be prefixed by the protocol ( e.g. C ) and postfixed by the port ( C, C,... ). If the caller has 'proto','addr' and 'port' already as seperate items it can call the method with %SPEC instead. Right now it has now way to check if the leg can deliver to a specific host because it has no access to the routing information of the underlying OS, so that only proto will be checked. =item fd Returns socket of leg. In some special environments (like tests) there might be legs, which don't have a socket associated. In this case you need to call B from L yourself, because it cannot be called automatically once it receives data on the socket. =item dump Returns string containing information about the leg. Used for debugging. =back