PJSIP 中的 TCP 傳輸配置指南

PJSIP 支持通過 TCP 傳輸 SIP 消息,相比 UDP 提供了更可靠的傳輸機制。以下是關于在 PJSIP 中使用 TCP 的詳細指南。

1. 創建 TCP 傳輸

基本 TCP 傳輸配置

c

pjsua_transport_config tcp_cfg;
pjsua_transport_config_default(&tcp_cfg);
tcp_cfg.port = 5060; // SIP 標準端口// 創建 TCP 傳輸
pjsua_transport_id tcp_id;
pj_status_t status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcp_cfg, &tcp_id);
if (status != PJ_SUCCESS) {// 錯誤處理
}

2. TCP 與 UDP 的區別

特性TCPUDP
可靠性可靠,有重傳機制不可靠,可能丟包
連接方式面向連接無連接
頭部開銷較大 (20字節)較小 (8字節)
適用場景不穩定網絡環境局域網等穩定環境

3. 高級 TCP 配置

保持連接活躍

c

tcp_cfg.qos_type = PJ_QOS_TYPE_VOICE;
tcp_cfg.qos_ignore_error = PJ_TRUE;// 啟用 TCP keepalive
tcp_cfg.tcp_keep_alive = PJ_TRUE;
tcp_cfg.tcp_keep_alive_interval = 30; // 秒
tcp_cfg.tcp_keep_alive_idle = 60;    // 秒

設置連接超時

c

tcp_cfg.tcp_conn_timeout = 5000; // 5秒連接超時

4. TCP TLS 配置 (安全傳輸)

c

pjsua_transport_config tls_cfg;
pjsua_transport_config_default(&tls_cfg);
tls_cfg.port = 5061; // SIP TLS 標準端口// 配置證書
tls_cfg.tls_setting.ca_list_file = pj_str("/path/to/ca.pem");
tls_cfg.tls_setting.cert_file = pj_str("/path/to/cert.pem");
tls_cfg.tls_setting.privkey_file = pj_str("/path/to/privkey.pem");// 創建 TLS 傳輸
pjsua_transport_id tls_id;
status = pjsua_transport_create(PJSIP_TRANSPORT_TLS, &tls_cfg, &tls_id);

5. 多傳輸配置

可以同時配置 UDP 和 TCP 傳輸:

c

// 創建 UDP 傳輸
pjsua_transport_id udp_id;
pjsua_transport_config udp_cfg;
pjsua_transport_config_default(&udp_cfg);
udp_cfg.port = 5060;
pjsua_transport_create(PJSIP_TRANSPORT_UDP, &udp_cfg, &udp_id);// 創建 TCP 傳輸
pjsua_transport_id tcp_id;
pjsua_transport_config tcp_cfg;
pjsua_transport_config_default(&tcp_cfg);
tcp_cfg.port = 5060;
pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcp_cfg, &tcp_id);

6. 強制使用 TCP

如果希望強制使用 TCP 而不是 UDP:

c

pjsua_acc_config acc_cfg;
pjsua_acc_config_default(&acc_cfg);// 設置首選傳輸為 TCP
acc_cfg.transport_id = tcp_id;// 或者通過注冊 URI 指定傳輸
acc_cfg.reg_uri = pj_str("sip:domain.com;transport=tcp");

7. TCP NAT 穿越

TCP 的 NAT 穿越通常比 UDP 簡單,但仍需考慮:

c

// 啟用 STUN
pjsua_config cfg;
pjsua_config_default(&cfg);
cfg.stun_srv_cnt = 1;
cfg.stun_srv[0] = pj_str("stun.example.com");// 或使用 ICE
cfg.ice_cfg_use = PJSUA_ICE_CONFIG_USE_CUSTOM;
cfg.ice_cfg.enable_ice = PJ_TRUE;

8. 性能調優

c

// 調整 TCP 緩沖區大小
tcp_cfg.sock_rcvbuf_size = 8192;
tcp_cfg.sock_sndbuf_size = 8192;// 調整最大連接數
tcp_cfg.tcp_max_connections = 1000;

9. 常見問題解決

連接被拒絕

  • 檢查防火墻設置

  • 確認目標服務器監聽 TCP 端口

  • 檢查網絡路由

連接超時

  • 增加連接超時時間

  • 檢查網絡延遲

  • 驗證服務器是否可達

TLS 握手失敗

  • 確保證書路徑正確

  • 檢查證書有效期

  • 驗證證書鏈完整性

10. 調試 TCP 連接

啟用詳細日志:

c

pjsua_logging_config log_cfg;
pjsua_logging_config_default(&log_cfg);
log_cfg.console_level = 5;  // 更詳細的日志
log_cfg.level = 5;

TCP 特定日志可以通過 PJLIB 的 socket 日志查看:

c

extern pj_log_func *pj_log_get_log_func();
pj_log_set_level(3);
pj_log_set_log_func(&my_log_func);

通過合理配置 TCP 傳輸,可以在不穩定網絡環境下獲得更可靠的 SIP 通信體驗。對于移動設備或穿越復雜網絡環境的應用,TCP 通常是更好的選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90166.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小菜狗的云計算之旅,今天學習MySQL數據庫基礎知識及操作

目錄 一、概述 數據庫概念 數據庫的類型 關系型數據庫模型 關系數據庫相關概念 二、安裝 1、mariadb安裝 2、mysql安裝 3、啟動并開機自啟 4、本地連接(本地登錄) 三、mysql數據庫配置與命令 yum安裝后生成的目錄 mysql服務器的啟動腳本 數…

為什么是直接在**原型(prototype)上**添加函數

這是一個非常經典、核心的 JavaScript 面向對象編程問題:> 為什么是直接在**原型(prototype)上**添加函數,而不是在類/構造函數內部直接添加?你提到的代碼中:javascript function TopSearchComponent() …

深入理解 classnames:React 動態類名管理的最佳實踐

在現代前端開發中,我們經常需要根據組件的狀態、屬性或用戶交互來動態切換 CSS 類名。雖然 JavaScript 提供了多種方式來處理字符串拼接,但隨著應用復雜性的增加,傳統的類名管理方式很快就會變得混亂不堪。這時,classnames 庫就像…

C++系列(七):深度探索C++內存 --- 分區、堆棧、new/delete與高效編程實踐

引言 程序運行的本質是對數據的處理,而內存則是程序執行的核心舞臺。理解內存的物理與邏輯分區,是掌握程序底層行為、編寫高效可靠代碼的關鍵基石。內存并非混沌一片,而是被嚴格劃分為代碼區、全局區、棧區和堆區。每個區域擁有獨特的生命周…

微信小程序71~80

1.總結小程序生命周期 小程序冷啟動,鉤子函數執行的順序保留當前頁面,進入下一個頁面,鉤子函數執行的順序銷毀當前頁面,進入下一個頁面,鉤子函數執行的順序小程序熱啟動,鉤子函數執行的順序 2.使用Componen…

[Pytest][Part 3]檢測python package狀態

目錄 實現需求1: 檢查python package狀態——pkg_resource hook實現自動檢測包狀態 conftest.py hook鉤子函數 Part1: https://blog.csdn.net/x1987200567/article/details/144915315?spm1001.2014.3001.5501 從這里開始逐個實現Part1中的需求 實現需求1&a…

自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

🕓 自定義時間范圍選擇組件使用教程(基于 Vue 3 Element Plus)? 一個靈活實用的時間范圍選擇器,支持開始時間、結束時間、快捷時間選項、本地雙向綁定、插槽擴展等功能。–📘 一、功能介紹 該組件基于 Element Plus …

YOLOv8 模型轉換 ONNX 后 C# 調用異常:一個參數引發的跨平臺適配難題

一、問題背景:從 Python 訓練到 C# 部署的跨平臺需求 作為一名 C# 開發者,我在完成 YOLOv8 模型訓練(使用 Ultralytics 官方框架,訓練數據為自定義目標檢測數據集,輸入尺寸 640x640,訓練輪次 100 輪&#…

Apache Cloudberry 亮相 2025 IvorySQL 生態大會暨 PostgreSQL 高峰論壇

6 月 27 日至 28 日,IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇在泉城濟南順利召開。本屆大會由 IvorySQL 開源數據庫社區主辦、瀚高基礎軟件股份有限公司承辦,吸引了來自國內外的數據庫技術專家、開發者與開源愛好者齊聚一堂,聚焦數據庫…

CMake之CMakeLists.txt語法規則

本文主要參考正點原子的應用開發手冊,僅作為本人學習筆記使用。 目錄 cmake 的使用方法其實還是非常簡單的,重點在于編寫 CMakeLists.txt,CMakeLists.txt 的語法規則也簡單,并沒有 Makefile的語法規則那么復雜難以理解&#xff01…

Mysql專題復習

重點內容:1. Mysql架構:客戶端 Server層 存儲引擎2. 索引數據結構:B樹4. 索引優化:覆蓋索引、排序、JOIN、分頁; COUNT; 索引下推;單/雙路排序5. 數據庫事務; 鎖;隔離級別&#xff…

CLIP的tokenizer詳解

一、bytes_to_unicodedef bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you wa…

【如何判斷Linux系統是Ubuntu還是CentOS】

要確定您的操作系統是 Ubuntu 還是 CentOS,可以通過以下方法快速檢查: 方法 1:通過終端命令(推薦) 在終端中執行以下命令之一: 查看 /etc/os-release 文件 cat /etc/os-releaseUbuntu 特征:顯示…

RISCV Linux 虛擬內存精講系列二 -- Linux 入口 head.S

通過 Linux 的構建系統,即 Linux 源代碼的根目錄下的 Makefile,能夠找到 vmlinux 的鏈接文件,從而能夠查看其入口代碼 head.S:_start, 如下: Linux 構建系統主Makefile: vmlinux.lds: head.S: 找到該入口后&#xff0c…

springAI學習:Advisors

spring AI Advisors類似于攔截器,會對請求的prompt做出特定的修改和增強(比如傳入歷史溝通記錄、搜索信息等等),以達到完善prompt的目的。通過Advisors API,開發人員可以創建更為復雜、可重用、可維護的AI組件。下面介…

MySQL CDC與Kafka整合指南:構建實時數據管道的完整方案

一、引言:現代數據架構的實時化需求 在數字化轉型浪潮中,實時數據已成為企業的核心資產。傳統批處理ETL(每天T1)已無法滿足以下場景需求: 實時風險監控(金融交易)即時個性化推薦(電商…

MATLAB | 繪圖復刻(二十一)| 扇形熱圖+小提琴圖

前段時間在小紅書刷到了一個很有特色的熱力圖,由大佬滾筒洗衣機創作,感覺很有意思,嘗試 MATLAB 復刻: 作者使用的是 python 代碼,趕快去瞅瞅。 復刻效果 正文部分 0.數據準備 數據需要一個用來畫熱圖的矩陣以及一個…

批量PDF轉換工具,一鍵轉換Word Excel

軟件介紹 今天為大家推薦一款高效的Office文檔批量轉換工具,能夠快速將Word和Excel文件批量轉換為PDF格式。 軟件特點 這款名為"五五Excel word批量轉PDF"的工具體積小巧,不到2M大小,卻能實現強大的批量轉換功能&#xff0c…

面試150 基本計算器

思路 利用棧(stack)來保存進入括號前的計算狀態(包括當前計算結果和符號),以便在括號結束后正確恢復計算上下文。代碼通過遍歷字符串,識別數字、加號、減號和括號。遇到數字時構造完整數值;遇到…

源哈希(sh)解析

源哈希(Source Hashing)是一種負載均衡算法,它根據請求的源 IP 地址(或其他標識符)生成哈希值,然后根據這個哈希值將請求分配到特定的后端服務實例。這種方法常用于確保來自同一客戶端的請求始終被路由到同…