< Previous by Date Date Index Next by Date >
< Previous in Thread Thread Index Next in Thread >

Re: [reSIProcate-users] How to code this simple SIP session?


Hi Scott,

Thanks for the response. I tried the steps suggested by you, to no
avail. About reading the RFC, libraries like reSIProcate exist because
lazy people like me could be saved from such drudgery :-). What I am
looking for is a sequence of API calls (just the function calls, not
the entire code) to manage the scenario I described in my earlier
mail. For instance, if I am using an HTTP wrapper, I expect to see
something like this, somewhere in the docs:

HttpClient client (host, port);
client.request ("index.html");
client.close ();

Is there something similar for reSIProcate? It will be really useful
if the docs show how to achieve simple tasks like this.

best regards,

-- Vijay

On Fri, Apr 9, 2010 at 7:39 PM, Scott Godin <sgodin@xxxxxxxxxxxxxxx> wrote:
> Seems like a good read through of RFC3261 would be good to get a better
> understanding how to form valid SIP messages and responses.  There are also
> code samples throughout resip that will help - see dum/Helper.cxx and
> stack/DeprecatedDialog.cxx.
> A couple of things I see quickly:
> 1.  The CSEQ in the ACK should match the invite.
> 2.  The ACK/200 message should be routed to the Contact header received in
> the 200.  If the destination is not receiving the ACK or it is malformed,
>  they will retransmit the 200.
> 3.  You don't need to populate the via header - the stack will do this for
> you as long as you add an empty via header:  see Helper::makeRequest for a
> good sample.  Similar rules apply to the Contact header - you only need to
> add a empty contact header with the user field only populated - the stack
> will fill in the rest.
> Scott
>
> On Fri, Apr 9, 2010 at 8:50 AM, Vijay Mathew <vijay.the.schemer@xxxxxxxxx>
> wrote:
>>
>> Hi all,
>>
>> I want to create a simple SIP client that will do the following
>> interactions with an existing SIP server:
>>
>> client                                    server
>>
>> INVITE   ============>
>>             <===========      200 OK
>> ACK      ============>
>>             <============   SUBSCRIBE
>> 200 OK  =============>
>> NOTIFY  =============>
>>            <=============   200 OK
>> BYE     ==============>
>>           <==============  200 OK
>>
>> I tried the following code to start with the INVITE and the ACK. I get
>> "200 OK" for the INVITE but for the ACK, I am again getting the same
>> "200 OK" that I got for the INVITE. What did I do wrong?
>>
>> static SipMessage* receive(SipStack& tu)
>> {
>>        while (true)
>>        {
>>                Sleep(100);
>>                SipMessage *msg = stack.receive();
>>                if (msg)
>>                {
>>                        std::cout << *msg << '\n';
>>                        return msg;
>>                }
>>        }
>>        return 0;
>> }
>>
>> int
>> main ()
>> {
>>    NameAddr target;
>>    target.uri().scheme() = "sip";
>>    target.uri().host() = "192.168.114.211";
>>    target.uri().port() = 5060;
>>    target.uri().param(p_transport) = "tcp";
>>
>>    NameAddr from = target;
>>    from.uri().user() = "me";
>>    from.uri().port() = 5070;
>>
>>    std::auto_ptr<SipMessage> reg(Helper::makeInvite(target, from));
>>
>>    reg->header(h_Contacts).clear();
>>    reg->header(h_Contacts).push_back(from);
>>    reg->header(h_Vias).front().transport() = Data("tcp");
>>    reg->header(h_Vias).front().sentHost() = "192.168.114.211";
>>    reg->header(h_Vias).front().sentPort() = 5070;
>>        Tokens tokens;
>>        tokens.push_back(Token(Data("x-com-nice-imm-call-state")));
>>        reg->header(h_AllowEvents) = tokens;
>>
>>        std::cout << *reg << '\n';
>>
>>        SipStack stack;
>>        stack.addTransport(TCP, 5070);
>>        StackThread stackThread(stack);
>>        stackThread.run();
>>        stack.send(*reg);
>>
>>        SipMessage* msg = receive(stack);
>>        if (msg)
>>        {
>>                if (msg->isResponse())
>>                {
>>                        std::cout << "REASON=" << msg->getReason() << "\n";
>>                        std::auto_ptr<SipMessage>
>> reg(Helper::makeRequest(target, from, ACK));
>>                        reg->header(h_Contacts).clear();
>>                        reg->header(h_Contacts).push_back(from);
>>                        reg->header(h_Vias).front().transport() =
>> Data("tcp");
>>                        reg->header(h_Vias).front().sentHost() =
>> "192.168.114.211";
>>                        reg->header(h_Vias).front().sentPort() = 5070;
>>                        reg->header(h_CallID) = msg->header(h_CallId);
>>                        std::cout << *reg << '\n';
>>                        delete msg;
>>                        msg = 0;
>>                        stack.send(*reg);
>>                }
>>                else
>>                {
>>                        std::cout << "MSG is not a response\n";
>>                }
>>        }
>>
>>        msg = receive(stack);
>>        if (msg)
>>        {
>>                if (msg->isResponse())
>>                {
>>                        std::cout << "REASON=" << msg->getReason() << "\n";
>>                        delete msg;
>>                        // std::auto_ptr<SipMessage>
>> reg(Helper::makeRequest(target, from, ACK));
>>                }
>>                else
>>                {
>>                        std::cout << "MSG is not a response\n";
>>                }
>>        }
>>
>>        return 0;
>> }
>>
>> Thanks in advance,
>>
>> -- Vijay
>> _______________________________________________
>> resiprocate-users mailing list
>> resiprocate-users@xxxxxxxxxxxxxxx
>> List Archive: http://list.resiprocate.org/archive/resiprocate-users/
>
>