Tan Miaoqing wrote: > 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 >> >> > > > > Ok thanks, I will have look at this.
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