Hi,

Why not take a look at sofsipcli, a command line based VoIP/IM SIP UA
which demonstrates how to use sofsipcli.

http://wiki.opensource.nokia.com/projects/SofSipCli

You can find the source code from here:

http://sofia-sip.org/repos/sofsip-cli/

BR

Tan

On Wed, Aug 27, 2008 at 4:01 PM, Rémi BUISSON <[EMAIL PROTECTED]> wrote:
> Hi everyone,
>
> I'm new in sofia sip so don't be hard on me if my questions are boring ;-)
>
> I have to write a RTSP client/server like program using sip messages.
>
> First of all I would like to write a server which accept connexion of
> the clients and do a task switch the content of the message (which can
> be XML like cc//pp or just <play/>).
>
> I think I succeed in writing it but the client doesn't stop properly.
>
> I got this message :
> nua_destroy(0x804b4b8): FATAL: nua_shutdown not completed
> client: nua.c:235: nua_destroy: Assertion `nua->nua_shutdown' failed.
> Aborted
>
> Here is my code (client) :
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #include <sofia-sip/nua.h>
>
> /*******************************/
> /* Variables declaration       */
> /*******************************/
> static su_root_t *root = NULL;
>
>
> /*******************************/
> /* Functions declaration       */
> /*******************************/
>
> static void event_callback(nua_event_t   event,
>               int           status,
>               char const   *phrase,
>               nua_t        *nua,
>               nua_magic_t  *magic,
>               nua_handle_t *nh,
>               nua_hmagic_t *hmagic,
>               sip_t const  *sip,
>               tagi_t        tags[]);
> static void sendClientInformations(void);
>
> /*******************************/
> /* Main function               */
> /*******************************/
> int main(int argc, char **argv){
>  sendClientInformations();
>  return EXIT_SUCCESS;
> }
>
> /*******************************/
> /* Implementation of functions */
> /*******************************/
>
> static void sendClientInformations(void)
> {
>  nua_t *nua;
>  nua_handle_t *handle;
>
>  /* Initialize Sofia-SIP library and create event loop */
>
>  su_init ();
>  root = su_root_create (NULL);
>
>  /* Create a user agent instance. Caller and callee should bind to
> different
>   * address to avoid conflicts. The stack will call the 'event_callback()'
>   * callback when events such as succesful registration to network,
>   * an incoming call, etc, occur.
>   */
>  nua = nua_create(root, /* Event loop */
>                   event_callback, /* Callback for processing events */
>                   NULL, /* Additional data to pass to callback */
>           NUTAG_URL("sip:0.0.0.0:2345;transport=tcp"), /* Address to
> bind to */
>                   TAG_END()); /* Last tag should always finish the
> sequence */
>
>  /* Send the informations */
>  handle = nua_handle(nua, NULL,
> SIPTAG_TO_STR("sip:[EMAIL PROTECTED]:1234"), TAG_END());
>
>  nua_message(handle,
>          SIPTAG_CONTENT_TYPE_STR("application/XML"),
>          SIPTAG_PAYLOAD_STR("PLAY"),
>          TAG_END());
>
>  nua_handle_destroy (handle);
>
>  /* Run event loop */
>  su_root_run (root);
>
>  /* Destroy allocated resources */
>  nua_destroy (nua);
>  su_root_destroy (root);
>  su_deinit ();
> }
>
> /* This callback will be called by SIP stack to
>  * process incoming events
>  */
> void event_callback(nua_event_t   event,
>                    int           status,
>                    char const   *phrase,
>                    nua_t        *nua,
>                    nua_magic_t  *magic,
>                    nua_handle_t *nh,
>                    nua_hmagic_t *hmagic,
>                    sip_t const  *sip,
>                    tagi_t        tags[])
> {
>  printf("%s received MESSAGE: %03d %s\n", __FILE__, status, phrase);
>
>  printf("From: %s%s" URL_PRINT_FORMAT "\n",
>         sip->sip_from->a_display ? sip->sip_from->a_display : "",
>         sip->sip_from->a_display ? " " : "",
>         URL_PRINT_ARGS(sip->sip_from->a_url));
>
>  if (sip->sip_subject) {
>    printf("Subject: %s\n", sip->sip_subject->g_value);
>  }
>
>  if (sip->sip_content_type) {
>    printf("Content-type: %s\n", sip->sip_content_type->c_type);
>  }
>
>  if (sip->sip_payload) {
>    fwrite(sip->sip_payload->pl_data, sip->sip_payload->pl_len, 1, stdout);
>    fputs("\n", stdout);
>
>  }
>
>  if(sip->sip_payload && strcmp(sip->sip_payload->pl_data, "OK") == 0)
>    {
>      su_root_break(root);
>    }
> }
>
>
> server :
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <errno.h>
> #include <string.h>
>
> #include <sofia-sip/nua.h>
> #include <sofia-sip/sip_status.h>
>
> #include "server_gstreamer.h"
> #include "constants.h"
>
> /*******************************/
> /* Variables declaration       */
> /*******************************/
>
> static su_root_t *root = NULL;
> static nua_t *nua = NULL;
>
> /*******************************/
> /* Functions declaration       */
> /*******************************/
>
> static void event_callback(nua_event_t   event,
>               int           status,
>               char const   *phrase,
>               nua_t        *nua,
>               nua_magic_t  *magic,
>               nua_handle_t *nh,
>               nua_hmagic_t *hmagic,
>               sip_t const  *sip,
>               tagi_t        tags[]);
> static void confirmAction(void);
>
> /*******************************/
> /* Main function               */
> /*******************************/
>
> int main(int argc, char **argv){
>  /* Initialize Sofia-SIP library and create event loop */
>
>  su_init ();
>  root = su_root_create (NULL);
>
>  /* Create a user agent instance. Caller and callee should bind to
> different
>   * address to avoid conflicts. The stack will call the 'event_callback()'
>   * callback when events such as succesful registration to network,
>   * an incoming call, etc, occur.
>   */
>  nua = nua_create(root, /* Event loop */
>                   event_callback, /* Callback for processing events */
>                   NULL, /* Additional data to pass to callback */
>           NUTAG_URL("sip:0.0.0.0:1234;transport=tcp"),
>                   TAG_END()); /* Last tag should always finish the
> sequence */
>
>  /* Run event loop */
>  su_root_run (root);
>
>  /* Destroy allocated resources */
>  nua_destroy (nua);
>  su_root_destroy (root);
>  su_deinit ();
>
>  return EXIT_SUCCESS;
> }
>
>
> /*******************************/
> /* Implementation of functions */
> /*******************************/
>
> /* This callback will be called by SIP stack to
>  * process incoming events
>  */
> void event_callback(nua_event_t   event,
>                    int           status,
>                    char const   *phrase,
>                    nua_t        *nua,
>                    nua_magic_t  *magic,
>                    nua_handle_t *nh,
>                    nua_hmagic_t *hmagic,
>                    sip_t const  *sip,
>                    tagi_t        tags[])
> {
>  char buff[BUFFER_SIZE];
>
>  printf("%s received MESSAGE: %03d %s\n", __FILE__, status, phrase);
>
>  printf("From: %s%s" URL_PRINT_FORMAT "\n",
>         sip->sip_from->a_display ? sip->sip_from->a_display : "",
>         sip->sip_from->a_display ? " " : "",
>         URL_PRINT_ARGS(sip->sip_from->a_url));
>
>  if(sip->sip_subject)
>    {
>      printf("Subject: %s\n", sip->sip_subject->g_value);
>    }
>
>  if(sip->sip_content_type)
>    {
>      printf("Content-type: %s\n", sip->sip_content_type->c_type);
>    }
>
>  if(sip->sip_payload && strcmp(sip->sip_payload->pl_data, "PLAY") == 0)
>    {
>      printf("PLAY\n");
>      confirmAction();
>      /*fwrite(sip->sip_payload->pl_data, sip->sip_payload->pl_len, 1,
> stdout);
>    fputs("\n", stdout);  */
>    }
> }
>
> void confirmAction(void)
> {
>  nua_handle_t *handle;
>
>  /* Send the informations */
>  handle = nua_handle(nua, NULL,
> SIPTAG_TO_STR("sip:[EMAIL PROTECTED]:2345"), TAG_END());
>
>  nua_message(handle,
>          SIPTAG_CONTENT_TYPE_STR("application/XML"),
>          SIPTAG_PAYLOAD_STR("OK"),
>          TAG_END());
>  printf("SENT\n");
>  nua_handle_destroy (handle);
> }
>
> If my code doesn't permit doing  what I want, what is the better mean to
> do it ? sample code ?
>
> Thanks in advance.
>
> Rémi
>
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
> Build the coolest Linux based applications with Moblin SDK & win great prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/
> _______________________________________________
> Sofia-sip-devel mailing list
> Sofia-sip-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel
>



-- 
Best Regards
Tan Miaoqing
Software engineer, Maemo Software
Nokia Devices R&D
http://users.tkk.fi/~mitan

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Sofia-sip-devel mailing list
Sofia-sip-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel

Reply via email to