本文共 8933 字,大约阅读时间需要 29 分钟。
#!/bin/sh./sip_reg \-r sip:188.131.134.191:5060 \-u sip:1002@188.131.134.191 \-c sip:1002@10.0.192.88:5060 \-U 1002 \-P 1002 \-p 5060 \-e 60 \-d
实例脚本
在eXosip中,当用户第一次发送注册请求后,eXosip会产生EXOSIP_REGISTRATION_FAILURE事件,注意这并不一定是注册失败,用户需要根据event->response->status_code 来判断具体的状态,如果是401状态,则是服务器需要用户再次发送带认证信息的注册请求;如果是其他值,则认为注册失败,比如无法连接服务器等。
对于EXOSIP_REGISTRATION_FAILURE事件,有两种处理方式: 1、自动处理。 在eXosip事件处理循环中调用eXosip_automatic_action()函数,该函数会自动帮助用户处理401/407状态,用户并不再需要手动发送带认证信息的注册请求,只需要在第一次注册时就添加好认证信息即可; 2、手动处理,需要在EXOSIP_REGISTRATION_FAILURE事件中增加以下代码:
/* * 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#include #endif#if !defined(WIN32) && !defined(_WIN32_WCE)#include #include #include #include #include #include #include #include #ifndef OSIP_MONOTHREAD#include #endif#endif#ifdef _WIN32_WCE/* #include */#include #endif#include #include #if !defined(WIN32) && !defined(_WIN32_WCE) && !defined(__arc__)#define _GNU_SOURCE#include #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 voidsyslog_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);#ifndef OSIP_MONOTHREADstatic 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;struct eXosip_t *context_eXosip;#ifndef OSIP_MONOTHREADstatic 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 (context_eXosip); reg = eXosip_register_send_register (context_eXosip, regparam->regid, NULL); printf("======================eXosip_register_send_register:%d\n", reg); 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 (context_eXosip); } return NULL; }#endif#ifdef _WIN32_WCEint WINAPIWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)#elseintmain (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 };#ifndef OSIP_MONOTHREAD 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) { daemon (1, 0); }#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); context_eXosip = eXosip_malloc (); if (eXosip_init (context_eXosip)) { syslog_wrapper (LOG_ERR, "eXosip_init failed"); exit (1); } if (eXosip_listen_addr (context_eXosip, IPPROTO_TCP, 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 (context_eXosip, localip, port); } if (firewallip) { syslog_wrapper (LOG_INFO, "firewall address: %s:%i", firewallip, port); eXosip_masquerade_contact (context_eXosip, firewallip, port); } eXosip_set_user_agent (context_eXosip, UA_STRING); if (username && password) { syslog_wrapper (LOG_INFO, "username: %s", username); syslog_wrapper (LOG_INFO, "password: [removed]"); if (eXosip_add_authentication_info (context_eXosip, 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 (context_eXosip, fromuser, proxy, contact, regparam.expiry * 2, ®); printf("=============================regid:%d\n", regparam.regid); if (regparam.regid < 1) { syslog_wrapper (LOG_ERR, "eXosip_register_build_initial_register failed"); exit (1); } i = eXosip_register_send_register (context_eXosip, regparam.regid, reg); printf("======================eXosip_register_send_register:%d\n", i); if (i != 0) { syslog_wrapper (LOG_ERR, "eXosip_register_send_register failed"); exit (1); } }#ifndef OSIP_MONOTHREAD register_thread = osip_thread_create (20000, register_proc, ®param); if (register_thread == NULL) { syslog_wrapper (LOG_ERR, "pthread_create failed"); exit (1); }#endif for (;;) { eXosip_event_t *event; if (!(event = eXosip_event_wait (context_eXosip, 0, 1))) {#ifdef OSIP_MONOTHREAD eXosip_execute (context_eXosip); eXosip_automatic_action (context_eXosip);#endif osip_usleep (10000); continue; }#ifdef OSIP_MONOTHREAD eXosip_execute (context_eXosip);#endif eXosip_automatic_action (context_eXosip); switch (event->type) { case EXOSIP_REGISTRATION_SUCCESS: syslog_wrapper (LOG_INFO, "registrered successfully"); printf("=======================registrered successfully\n"); break; case EXOSIP_REGISTRATION_FAILURE: regparam.auth = 1; 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); }}
参考:
转载地址:http://jmdxi.baihongyu.com/