基于simple_pjsua.c实现TCP

pjisp开发关于使用UDP/TCP通信问题

在PJSIP中,如果想指定使用TCP而不是默认的UDP传输协议,可以在URI中添加适当的参数。假设有一个URI字符串 “uri”,需要将它转换为 “pj_str_t” 类型,并在其中包含指定的传输协议参数。具体实现如下:

假设原始URI是 “sip:user@domain”,需要将其修改为 “sip:user@domain:5060;transport=tcp”。可以通过字符串操作来完成。

启动注册

这是我们提前启动并初始化相关的通信协议的相关配置,这里启动的协议类型主要是为了等待连接进行准备,创建成功后可启动wireshark进行抓包查看连接情况,wireshark抓包的使用可参考本人前文。

/* Add TCP transport. */
    {
        pjsua_transport_config cfg;

        pjsua_transport_config_default(&cfg);
        cfg.port = 5060;
        status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &cfg, NULL);
        if (status != PJ_SUCCESS) error_exit("Error creating transport", status);
    }

    /* Initialization is done, now start pjsua */
    status = pjsua_start();
    if (status != PJ_SUCCESS) error_exit("Error starting pjsua", status);

    /* Register to SIP server by creating SIP account. */
    {
        pjsua_acc_config cfg;

        pjsua_acc_config_default(&cfg);

        cfg.id = pj_str("sip:" SIP_USER "@" SIP_DOMAIN":5060;transport=tcp");
        cfg.reg_uri = pj_str("sip:" SIP_DOMAIN":5060;transport=tcp");
        cfg.cred_count = 1;
        cfg.cred_info[0].realm = pj_str(SIP_REALM);
        cfg.cred_info[0].scheme = pj_str("digest");
        cfg.cred_info[0].username = pj_str(SIP_USER);
        cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
        cfg.cred_info[0].data = pj_str(SIP_PASSWD);

        status = pjsua_acc_add(&cfg, PJ_TRUE, &acc_id);
        if (status != PJ_SUCCESS) error_exit("Error adding account", status);
    }

启动注册

请求消息

开始请求消息的进行,这要需要注意UDP和TCP的请求sip命令存在差异,TCP协议需要进行特别处理才能使用TCP协议请求成功。

		if (option[0] == 'm') {

            puts("Enter SIP URI to call: ");
            if (fgets(uri, sizeof(uri), stdin) == NULL) {
                puts("Error reading SIP URI");
                continue;
            }
            add_tcp_transport_suffix(uri);
            pj_str_t pj_uri = pj_str(uri);
            status = pjsua_call_make_call(acc_id, &pj_uri, 0, NULL, NULL, NULL);
            if (status != PJ_SUCCESS)
                puts("Error making call");
        }

这里的make call请求设计可参考本人前文。

void add_tcp_transport_suffix(char* uri) {
    const char* tcp_suffix = ":5060;transport=tcp";

    // Remove newline character if present
    size_t len = strlen(uri);
    if (len > 0 && uri[len - 1] == '\n') {
        uri[len - 1] = '\0';
    }

    // Check if there's enough space to add the suffix
    if (len + strlen(tcp_suffix) < MAX_URI_LEN) {
        strcat(uri, tcp_suffix);
    }
    else {
        puts("URI too long to add TCP transport suffix");
    }
}

请求消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值