博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
eXosip示例程序——注册/认证 .
阅读量:4160 次
发布时间:2019-05-26

本文共 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, &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 (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/

你可能感兴趣的文章
IntelliJ IDAE 2018.2 汉化
查看>>
Openwrt源码下载与编译
查看>>
我和ip_conntrack不得不说的一些事
查看>>
Linux 查看端口使用情况
查看>>
文件隐藏
查看>>
两个linux内核rootkit--之二:adore-ng
查看>>
两个linux内核rootkit--之一:enyelkm
查看>>
关于linux栈的一个深层次的问题
查看>>
rootkit related
查看>>
配置文件的重要性------轻化操作
查看>>
又是缓存惹的祸!!!
查看>>
为什么要实现程序指令和程序数据的分离?
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>
无protobuf协议情况下的反序列化------貌似无解, 其实有解!
查看>>
make -n(仅列出命令, 但不会执行)用于调试makefile
查看>>
makefile中“-“符号的使用
查看>>
go语言如何从终端逐行读取数据?------用bufio包
查看>>
go的值类型和引用类型------重要的概念
查看>>
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>