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