SIP服务器protocal stack选择

      由于工作,需要自己开发一个SIP软交换。严格意义上已不是什么sip proxy、sip registar、sip redirect、B2BUA的哪一个了。其实国内做这个的,大家都差不多是一个server,搞定了注册、路由、认证、计费的功能。

 

      认证、计费、路由这些都是自定义业务,每个项目的需求都不太一样,需要自己基于数据库来做。这部分的代码也比较容易搞定,就是些sql语句罢了。

 

      比较麻烦的是sip本身的一些处理,如SIP消息解析、事务状态机、会话管理等,严格参照RFC3261来实现不太可取,工作量太大。

 

      在当下开源项目这么多的情况下,选择一个开源的协议栈作为开发的基础,应该是个不错的选择。未来降低复杂性,优先选择仅支持SIP的协议栈,方便对代码的掌握。

 

      当下比较纯粹的sip协议栈,当属osip。但osip本身看上去效率不高是事实,代码看上去非常的简单,虽然没有什么文档支持,但很容易看懂。估计实际用起来会有不少地方需要优化的,搞到最后和自己写一个也差不多了。

 

      根据我个人开发softphone的经验,发现pjsip非常不错。系统设计优良、效率很高,对标准的支持也很完善。根据2年来的跟踪情况看,社区开发也一直都很活跃,但由于系统的结构化做的非常好,主设计一直都很稳定。而且pjsip社区一直都注重文档工作,相关文档和代码里的注释也是非常的多。

 

      个人倾向基于pjsip里的sip协议部分来开发sip软交换,不过在开发softphone的过程中发现,pjsip从头到尾都是为softphone而设计。担心作为服务器的协议栈,会有意想不到的限制。已经发现代码里有很多XX_MAX宏定义,定义了诸如最大transaction、最大dialog等。

 

      借此宝地发文,寄望于我辈同道中人,能有幸一起讨论分析。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于 PJSIP 库的 Linux SIP 服务器示例代码: ```c #include <pjlib.h> #include <pjlib-util.h> #include <pjnath.h> #include <pjmedia.h> #include <pjmedia-codec.h> #include <pjsip.h> #include <pjsip_ua.h> #include <pjsip_simple.h> #define THIS_FILE "sip_server.c" /* Port to listen for incoming SIP requests */ #define SIP_PORT 5060 /* SIP logging callback */ static void log_cb(int level, const char *data, int len) { PJ_LOG(level, (THIS_FILE, "%.*s", len, data)); } /* SIP user agent callback */ static pj_bool_t on_rx_request(pjsip_rx_data *rdata) { /* Handle incoming SIP request here */ return PJ_TRUE; } /* Main function */ int main(int argc, char *argv[]) { pj_status_t status; pjsip_endpoint *endpoint; pj_caching_pool cp; pj_pool_t *pool; pj_thread_t *thread; /* Initialize PJLIB */ status = pj_init(); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Create a pool factory */ pj_caching_pool_init(&cp, NULL, 0); /* Create a new memory pool */ pool = pj_pool_create(&cp.factory, "sip_server", 4000, 4000, NULL); /* Create a new SIP endpoint */ status = pjsip_endpt_create(&cp.factory, NULL, &endpoint); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Initialize endpoint logging */ pjsip_endpt_set_log_func(endpoint, log_cb, NULL, 4); /* Initialize SIP stack */ status = pjsip_endpt_startup(endpoint, NULL, 1, NULL); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Create a transport adapter */ status = pjsip_udp_transport_start(endpoint, NULL, SIP_PORT, NULL, 1, NULL); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Register user agent callback */ status = pjsip_endpt_register_module(endpoint, &pjsip_simple_module); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Create a new thread for handling incoming requests */ status = pj_thread_create(pool, "sip_server_thread", (pj_thread_proc*)&pjsip_endpt_handle_events, endpoint, PJ_THREAD_DEFAULT_STACK_SIZE, 0, &thread); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); /* Wait for user input */ while (1) { char ch; PJ_LOG(3, (THIS_FILE, "Press 'q' to quit...")); scanf("%c", &ch); if (ch == 'q') { break; } } /* Stop SIP stack */ pjsip_endpt_shutdown(endpoint); /* Destroy endpoint */ pjsip_endpt_destroy(endpoint); /* Destroy memory pool */ pj_pool_release(pool); /* Shutdown PJLIB */ pj_shutdown(); return 0; } ``` 这是一个基本的 SIP 服务器示例,可以接收来自客户端的 SIP 请求。你需要根据实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值