eXosip示例程序——注册/认证 .

2024-02-22 02:38

本文主要是介绍eXosip示例程序——注册/认证 .,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#!/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 <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>
#ifndef OSIP_MONOTHREAD
#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);#ifndef OSIP_MONOTHREAD
static void *register_proc (void *arg);
#endifstatic void
usage (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_MONOTHREAD
static void *
register_proc (void *arg)
{struct regparam_t *regparam = arg;int reg;for (;;) {
#ifdef _WIN32_WCESleep ((regparam->expiry / 2) * 1000);
#elsesleep (regparam->expiry / 2);
#endifeXosip_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_WCEfprintf (stdout, "eXosip_register: error while registring");
#elseperror ("eXosip_register");
#endifexit (1);}regparam->auth = 0;eXosip_unlock (context_eXosip);}return NULL;	
}
#endif#ifdef _WIN32_WCE
int WINAPI
WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
#else
int
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;
#endifchar *username = NULL;char *password = NULL;struct regparam_t regparam = { 0, 3600, 0 };
#ifndef OSIP_MONOTHREADstruct osip_thread *register_thread;
#endifint debug = 0;int nofork = 0;#ifdef _WIN32_WCEproxy = osip_strdup ("sip:sip.antisip.com");fromuser = osip_strdup ("sip:jack@sip.antisip.com");#elsefor (;;) {
#define short_options "c:de:f:hl:p:r:u:U:P:"
#ifdef _GNU_SOURCEint 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);
#elsec = getopt (argc, argv, short_options);
#endifif (c == -1)break;switch (c) {case 'c':contact = optarg;break;case 'd':nofork = 1;
#ifdef LOG_PERRORdebug = LOG_PERROR;
#endifbreak;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);elseport = atoi (optarg);
#elseport = atoi (optarg);
#endifbreak;case 'r':proxy = optarg;break;case 'u':fromuser = optarg;break;case 'U':username = optarg;break;case 'P':password = optarg;break;default:break;}}
#endifif (!proxy || !fromuser) {usage ();exit (1);}
#ifndef _WIN32_WCEif (!nofork) {daemon (1, 0);}
#endif#if 0openlog (PROG_NAME, LOG_PID | debug, SYSLOG_FACILITY);
#endifsyslog_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, &reg);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_MONOTHREADregister_thread = osip_thread_create (20000, register_proc, &regparam);if (register_thread == NULL) {syslog_wrapper (LOG_ERR, "pthread_create failed");exit (1);}
#endiffor (;;) {eXosip_event_t *event;if (!(event = eXosip_event_wait (context_eXosip, 0, 1))) {
#ifdef OSIP_MONOTHREADeXosip_execute (context_eXosip);eXosip_automatic_action (context_eXosip);
#endifosip_usleep (10000);continue;}
#ifdef OSIP_MONOTHREADeXosip_execute (context_eXosip);
#endifeXosip_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);}
}

 

参考:

https://blog.csdn.net/yyyxxxzzz111/article/details/24885631

这篇关于eXosip示例程序——注册/认证 .的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733879

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给