1、新建项目 -> 在 "pjproject-2.8" 根目录同级;

2、附加包含目录 "../../pjproject-2.8/pjsip/include/;../../pjproject-2.8/pjlib/include/;../../pjproject-2.8/pjlib-util/include/;../../pjproject-2.8/pjnath/include/"

3、链接器 -> 附加库目录 "../../pjproject-2.8/lib/;../../pjproject-2.8/pjlib/lib/;../../pjproject-2.8/pjlib-util/lib/;../../pjproject-2.8/pjsip/lib/;../../pjproject-2.8/pjnath/lib/"

4、链接器 -> 输入 -> 附加依赖项 " ws2_32.lib;pjlib-i386-Win32-vc14-Debug.lib;pjlib-util-i386-Win32-vc14-Debug.lib;pjnath-i386-Win32-vc14-Debug.lib;pjsip-core-i386-Win32-vc14-Debug.lib;"

5、ip转 pj_unit_32


pj_in_addr in_addr;
pj_str_t host = pj_str("192.168.0.55");
pj_inet_aton(&host, &in_addr);// string ip 转 pj_uint32_t
addr.sin_addr.s_addr = in_addr.s_addr; //0;

6、完整代码


#include "stdafx.h"
#include <pjsip.h>
#include <pjlib-util.h>
#include <pjlib.h>/* If this macro is set, UDP transport will be initialized at port 5060 */
#define HAS_UDP_TRANSPORT/* If this macro is set, TCP transport will be initialized at port 5060 */
#define HAS_TCP_TRANSPORT   (1 && PJ_HAS_TCP)/* Log identification */
#define THIS_FILE       "sipstateless.c"  /* Global SIP endpoint */
static pjsip_endpoint *sip_endpt;/* What response code to be sent (default is 501/Not Implemented) */
static int code = PJSIP_SC_NOT_IMPLEMENTED;/* Additional header list */
struct pjsip_hdr hdr_list;/* usage() */
static void usage(void)
{puts("Usage:");puts("  sipstateless [code] [-H HDR] ..");puts("");puts("Options:");puts("  code     SIP status code to send (default: 501/Not Implemented");puts("  -H HDR   Specify additional headers to send with response");puts("           This option may be specified more than once.");puts("           Example:");puts("              -H 'Expires: 300' -H 'Contact: <sip:localhost>'");
}/* Callback to handle incoming requests. */
static pj_bool_t on_rx_request(pjsip_rx_data *rdata)
{/* Respond (statelessly) all incoming requests (except ACK!)                   * with 501 (Not Implemented)*/if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD){pjsip_endpt_respond_stateless(sip_endpt, rdata, code, NULL, &hdr_list, NULL);}return PJ_TRUE;
}/** main()**/
int main(int argc, char *argv[])
{pj_caching_pool cp;pj_pool_t *pool = NULL;pjsip_module mod_app ={NULL,NULL,                 /* prev, next.              */           { "mod-app", 7 },           /* Name.                    */            -1,                                 /* Id               */          PJSIP_MOD_PRIORITY_APPLICATION, /* Priority             */NULL,                       /* load()                   */NULL,                       /* start()                  */NULL,                       /* stop()                   */NULL,                       /* unload()                 */&on_rx_request,             /* on_rx_request()          */NULL,                       /* on_rx_response()         */NULL,                       /* on_tx_request.           */NULL,                       /* on_tx_response()         */NULL,                       /* on_tsx_state()           */};int c;pj_status_t status;/* Must init PJLIB first: */status = pj_init();PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);/* Then init PJLIB-UTIL: */status = pjlib_util_init();PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);/* Must create a pool factory before we can allocate any memory. */pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);/* Create global endpoint: */{/* Endpoint MUST be assigned a globally unique name.* Ideally we should put hostname or public IP address, but* we'll just use an arbitrary name here.*//* Create the endpoint: */status = pjsip_endpt_create(&cp.factory, "sipstateless", &sip_endpt);PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);}/* Parse arguments */pj_optind = 0;pj_list_init(&hdr_list);while ((c = pj_getopt(argc, argv, "H:")) != -1) {switch (c) {case 'H':if (pool == NULL) {pool = pj_pool_create(&cp.factory, "sipstateless", 1000,1000, NULL);}if (pool) {char *name;name = strtok(pj_optarg, ":");if (name == NULL) {puts("Error: invalid header format");return 1;}else {char *val = strtok(NULL, "\r\n");pjsip_generic_string_hdr *h;pj_str_t hname, hvalue;hname = pj_str(name);hvalue = pj_str(val);h = pjsip_generic_string_hdr_create(pool, &hname, &hvalue);pj_list_push_back(&hdr_list, h);PJ_LOG(4, (THIS_FILE, "Header %s: %s added", name, val));}}break;default:puts("Error: invalid argument");usage();return 1;}}if (pj_optind != argc) {code = atoi(argv[pj_optind]);if (code < 200 || code > 699) {puts("Error: invalid status code");usage();return 1;}}PJ_LOG(4, (THIS_FILE, "Returning %d to incoming requests", code));pj_in_addr in_addr;pj_str_t host = pj_str("192.168.0.55");pj_inet_aton(&host, &in_addr);/** Add UDP transport, with hard-coded port*/
#ifdef HAS_UDP_TRANSPORT{pj_sockaddr_in addr;addr.sin_family = pj_AF_INET();addr.sin_addr.s_addr = in_addr.s_addr; //0;       addr.sin_port = pj_htons(5060);status = pjsip_udp_transport_start(sip_endpt, &addr, NULL, 1, NULL);if (status != PJ_SUCCESS) {PJ_LOG(3, (THIS_FILE,"Error starting UDP transport (port in use?)"));return 1;}}
#endif#if HAS_TCP_TRANSPORT/** Add UDP transport, with hard-coded port*/{pj_sockaddr_in addr;addr.sin_family = pj_AF_INET();addr.sin_addr.s_addr = in_addr.s_addr; //0;   addr.sin_port = pj_htons(5060);status = pjsip_tcp_transport_start(sip_endpt, &addr, 1, NULL);if (status != PJ_SUCCESS) {PJ_LOG(3, (THIS_FILE,"Error starting TCP transport (port in use?)"));return 1;}}
#endif//delete in_addr;/** Register our module to receive incoming requests.*/status = pjsip_endpt_register_module(sip_endpt, &mod_app);PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);/* Done. Loop forever to handle incoming events. */PJ_LOG(3, (THIS_FILE, "Press Ctrl-C to quit.."));for (;;) {pjsip_endpt_handle_events(sip_endpt, NULL);}
}

(三)pjsip 监听相关推荐

  1. chromedp网络监听_动态爬虫三:监听网络事件 + 监听js事件

    一: 概述 上两篇文章介绍了cdp协议和chromedp库,从这篇文章开始动手实战一下,我们要拿到页面上更多的网络请求,最直接的想法就是类似于开发者工具里的network,只有一有网络请求就显示在列表 ...

  2. oracle——监听(三、监听配置)

    一.引言 oracle配置实例监听真是太坑了,下面我是按照一个监听在一个IP一个端口上监听多个实例 的情况下配置的,如果不明白监听有哪几类情况请看上一篇博客,下面是我配置监听遇到的大坑小坑== 更新- ...

  3. Vue3学习笔记(三)——计算/监听/样式/自定义指令

    点击查看上一篇文章

  4. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

  5. 在Android中实现监听 返回键,主键,菜单键

    一.监听 返回键 onKeyDown方法和onBackPressed方法 onKeyDown: 是当某个按键被按下是触发.所以也有人在点击返回键的时候去执行该方法来做判断.(该方法只是android ...

  6. Android监听后台状态,退出即杀死并显示退出提示框

    一.当界面不可见时释放内存 @Overridepublic void onTrimMemory(int level) {super.onTrimMemory(level);switch (level) ...

  7. Vue + Element UI——监听DOM元素高度和宽度解决方案整理(八种方法)

    问题描述 监听DOM元素大小的变化,在前端开发中,算是一个比较常见的需求,比如我们要制作可伸缩的图表的时候,可能需要根据DOM大小的变化,进行动态的更新图表. 解决方案 方法一: 监听window变化 ...

  8. nginx监听事件流程

    在前面的几篇文章中已经分析了master进程.work进程的初始化流程.但一直没有分析监听socket的创建流程,nginx服务器只有在创建socket, 绑定socet,监听socket执行完成后, ...

  9. js如何监听元素事件是否被移除_JS移除事件监听的方法 .removeEventListener( )

    JS用addEventListener添加事件监听方法后,可以用removeEventListener来解除监听: element.removeEventListener(event, myFunct ...

最新文章

  1. 【R语言学习】时间序列
  2. 山西省能源产业发展动向及投资风险分析报告2021版
  3. Java 11 究竟比 8 快了多少?看看这个基准测试
  4. C#属性: 利用set实现递归
  5. 基于FPGA的AM信号调制与解调详细步骤
  6. java:蓝桥杯练习 分解质因数
  7. 用Flex绘制带Icon的Tooltip
  8. PHP 处理execl的数据
  9. Python如何从一个文件中调用另一个文件的类
  10. 【汇编语言】,值得学习的“编程世界的常青树”
  11. web controls归档
  12. 20191004每日一句
  13. mysql undo损坏_当数据库没有备份,redo或undo损坏
  14. axure rp10安装教程,axurerp10安装步骤
  15. Greenplum 实时数据仓库实践(5)——实时数据同步
  16. Django+Vue实现群聊
  17. 地球同步、地球静止、半同步、太阳同步、极地、莫尼亚轨道阐释
  18. 2017年工作回顾及2018年新展望
  19. 矩阵等价和向量组等价
  20. 使用线程池优化多线程编程

热门文章

  1. SqlServer数据库置疑的解决办法
  2. 笔记——Python常用的标准库
  3. 设计模式——Facade
  4. 计算机毕业设计SSM电商后台管理系统【附源码数据库】
  5. 冒泡排序(C++)完整代码
  6. 哪个微信公众号第三方平台可以设置渠道二维码?
  7. 在simulink下编程stm32,为什么我的stm32用串口打印数据,总是00或者ff
  8. 从游戏机、计算机、智能手机的过去五十年 看VR和AR的未来五十年
  9. 计算机网络:数据报与虚电路
  10. mac jade 安装