exosip注册过程(转http://www.koders.com/c/fid6A93E066F256E8E5FC007DD515597A164D7D7593.aspx)

来源:互联网 发布:illegal character sql 编辑:程序博客网 时间:2024/04/29 12:23

/* * SIP Registration Agent -- by ww@styx.org *  * This program is Free Software, released under the GNU General * Public License v2.0 http://www.gnu.org/licenses/gpl * * This program will register to a SIP proxy using the contact * supplied on the command line. This is useful if, for some  * reason your SIP client cannot register to the proxy itself. * For example, if your SIP client registers to Proxy A, but * you want to be able to recieve calls that arrive at Proxy B, * you can use this program to register the client's contact * information to Proxy B. * * This program requires the eXosip library. To compile, * assuming your eXosip installation is in /usr/local, * use something like: * * gcc -O2 -I/usr/local/include -L/usr/local/lib sipreg.c / *         -o sipreg / *         -leXosip2 -losip2 -losipparser2 -lpthread * * It should compile and run on any POSIX compliant system * that supports pthreads. * */#if defined(__arc__)#define LOG_PERROR 1#include <includes_api.h>#include <os_cfg_pub.h>#endif#if !defined(WIN32) && !defined(_WIN32_WCE)#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <syslog.h>#ifdef OSIP_MT#include <pthread.h>#endif#endif#ifdef _WIN32_WCE/* #include <syslog.h> */#include <winsock2.h>#endif#include <osip2/osip_mt.h>#include <eXosip2/eXosip.h>#if !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__arc__)#define _GNU_SOURCE#include <getopt.h>#endif#define PROG_NAME "sipreg"#define PROG_VER  "1.0"#define UA_STRING "SipReg v" PROG_VER#define SYSLOG_FACILITY LOG_DAEMON#if defined(WIN32) || defined(_WIN32_WCE)static void syslog_wrapper(int a, const char *fmt, ...){  va_list args;  va_start (args, fmt);  vfprintf (stdout, fmt, args);  va_end (args);}#define LOG_INFO 0#define LOG_ERR 0#define LOG_WARNING 0#define LOG_DEBUG 0#elif defined(LOG_PERROR)/* If we can, we use syslog() to emit the debugging messages to stderr. */#define syslog_wrapper    syslog#else#define syslog_wrapper(a,b...) fprintf(stderr,b);fprintf(stderr,"/n")#endifstatic void usage (void);#ifdef OSIP_MTstatic void *register_proc (void *arg);#endifstatic voidusage (void){  printf ("Usage: " PROG_NAME " [required_options] [optional_options]/n"          "/n/t[required_options]/n"          "/t-r --proxy/tsip:proxyhost[:port]/n"          "/t-u --from/tsip:user@host[:port]/n"          "/n/t[optional_options]/n"          "/t-c --contact/tsip:user@host[:port]/n"          "/t-d --debug (log to stderr and do not fork)/n"          "/t-e --expiry/tnumber (default 3600)/n"          "/t-f --firewallip/tN.N.N.N/n"          "/t-h --help/n"          "/t-l --localip/tN.N.N.N (force local IP address)/n"          "/t-p --port/tnumber (default 5060)/n"          "/t-U --username/tauthentication username/n"          "/t-P --password/tauthentication password/n");}typedef struct regparam_t{  int regid;  int expiry;  int auth;} regparam_t;#ifdef OSIP_MTstatic void *register_proc (void *arg){  struct regparam_t *regparam = arg;  int reg;  for (;;)    {#ifdef _WIN32_WCE      Sleep ((regparam->expiry / 2)*1000);#else      sleep (regparam->expiry / 2);#endif      eXosip_lock ();      reg = eXosip_register_send_register (regparam->regid, NULL);      if (0 > reg)        {#ifdef _WIN32_WCE          fprintf(stdout, "eXosip_register: error while registring");#else          perror ("eXosip_register");#endif          exit (1);   }      regparam->auth = 0;      eXosip_unlock ();    }  return NULL;}#endif#ifdef _WIN32_WCEint WINAPI WinMain( HINSTANCE hInstance,     HINSTANCE hPrevInstance,     LPTSTR    lpCmdLine,     int       nCmdShow)#elseint main (int argc, char *argv[])#endif{  int c;  int port = 5060;  char *contact = NULL;  char *fromuser = NULL;  const char *localip = NULL;  const char *firewallip = NULL;  char *proxy = NULL;#if !defined(__arc__)  struct servent *service;#endif  char *username = NULL;  char *password = NULL;  struct regparam_t regparam = { 0, 3600, 0 };#ifdef OSIP_MT  struct osip_thread *register_thread;#endif  int debug = 0;  int nofork = 0;#ifdef _WIN32_WCE  proxy = osip_strdup("sip:sip.antisip.com");  fromuser = osip_strdup("sip:jack@sip.antisip.com");#else  for (;;)    {#define short_options "c:de:f:hl:p:r:u:U:P:"#ifdef _GNU_SOURCE      int option_index = 0;      static struct option long_options[] = {        {"contact", required_argument, NULL, 'c'},        {"debug", no_argument, NULL, 'd'},        {"expiry", required_argument, NULL, 'e'},        {"firewallip", required_argument, NULL, 'f'},        {"from", required_argument, NULL, 'u'},        {"help", no_argument, NULL, 'h'},        {"localip", required_argument, NULL, 'l'},        {"port", required_argument, NULL, 'p'},        {"proxy", required_argument, NULL, 'r'},        {"username", required_argument, NULL, 'U'},        {"password", required_argument, NULL, 'P'},        {NULL, 0, NULL, 0}      };      c = getopt_long (argc, argv, short_options, long_options, &option_index);#else      c = getopt (argc, argv, short_options);#endif      if (c == -1)        break;      switch (c)        {          case 'c':            contact = optarg;            break;          case 'd':            nofork = 1;#ifdef LOG_PERROR            debug = LOG_PERROR;#endif            break;          case 'e':            regparam.expiry = atoi (optarg);            break;          case 'f':            firewallip = optarg;            break;          case 'h':            usage ();            exit (0);          case 'l':            localip = optarg;            break;          case 'p':#if !defined(__arc__)            service = getservbyname (optarg, "udp");            if (service)              port = ntohs(service->s_port);            else              port = atoi (optarg);#else     port = atoi (optarg);#endif            break;          case 'r':            proxy = optarg;            break;          case 'u':            fromuser = optarg;            break;          case 'U':     username = optarg;            break;          case 'P':     password = optarg;            break;          default:            break;        }    }#endif  if (!proxy || !fromuser)    {      usage ();      exit (1);    }#ifndef _WIN32_WCE  if (!nofork)    {      int cpid = fork ();      if (cpid)                 /* parent */        exit (0);      /* child */      close (0);      close (1);      close (2);    }#endif#if 0  openlog (PROG_NAME, LOG_PID | debug, SYSLOG_FACILITY);#endif  syslog_wrapper (LOG_INFO, UA_STRING " up and running");  syslog_wrapper (LOG_INFO, "proxy: %s", proxy);  syslog_wrapper (LOG_INFO, "fromuser: %s", fromuser);  syslog_wrapper (LOG_INFO, "contact: %s", contact);  syslog_wrapper (LOG_INFO, "expiry: %d", regparam.expiry);  syslog_wrapper (LOG_INFO, "local port: %d", port);  if (debug>0)    TRACE_INITIALIZE (6, NULL);  if (eXosip_init ())    {      syslog_wrapper (LOG_ERR, "eXosip_init failed");      exit (1);    }  if (eXosip_listen_addr (IPPROTO_UDP, NULL, port, AF_INET, 0))    {      syslog_wrapper (LOG_ERR, "eXosip_listen_addr failed");      exit (1);    }  if (localip)    {      syslog_wrapper (LOG_INFO, "local address: %s", localip);      eXosip_masquerade_contact (localip, port);    }  if (firewallip)    {      syslog_wrapper (LOG_INFO, "firewall address: %s:%i", firewallip, port);      eXosip_masquerade_contact (firewallip, port);    }  eXosip_set_user_agent (UA_STRING);  if (username && password)    {      syslog_wrapper (LOG_INFO, "username: %s", username);      syslog_wrapper (LOG_INFO, "password: [removed]");      if (eXosip_add_authentication_info          (username, username, password, NULL, NULL))        {          syslog_wrapper (LOG_ERR, "eXosip_add_authentication_info failed");          exit (1);        }    }  {    osip_message_t *reg = NULL;    int i;    regparam.regid =      eXosip_register_build_initial_register (fromuser, proxy, contact, regparam.expiry*2,                                              &reg);    if (regparam.regid < 1)      {        syslog_wrapper (LOG_ERR, "eXosip_register_build_initial_register failed");        exit (1);      }    i = eXosip_register_send_register (regparam.regid, reg);    if (i != 0)      {        syslog_wrapper (LOG_ERR, "eXosip_register_send_register failed");        exit (1);      }  }#ifdef OSIP_MT  register_thread = osip_thread_create (20000, register_proc, &regparam);  if (register_thread==NULL)    {      syslog_wrapper (LOG_ERR, "pthread_create failed");      exit (1);    }#endif  for (;;)    {      eXosip_event_t *event;      if (!(event = eXosip_event_wait (0, 1)))        {#ifndef OSIP_MT   eXosip_execute();   eXosip_automatic_action ();#endif          osip_usleep (10000);          continue;        }#ifndef OSIP_MT      eXosip_execute();#endif      eXosip_automatic_action ();      switch (event->type)        {          case EXOSIP_REGISTRATION_NEW:            syslog_wrapper (LOG_INFO, "received new registration");            break;          case EXOSIP_REGISTRATION_SUCCESS:            syslog_wrapper (LOG_INFO, "registrered successfully");            break;          case EXOSIP_REGISTRATION_FAILURE:            regparam.auth = 1;            break;          case EXOSIP_REGISTRATION_TERMINATED:            printf ("Registration terminated/n");            break;          default:            syslog_wrapper (LOG_DEBUG,                            "recieved unknown eXosip event (type, did, cid) = (%d, %d, %d)",                            event->type, event->did, event->cid);        }      eXosip_event_free (event);    }}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sxcong/archive/2008/10/23/3129951.aspx

 

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn