首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

eXosip 事務 ID (tid) 不一致問題:異常斷線後需比對 Call-ID 清理舊事務

     編輯:程式設計疑難解答

現象

UAC 發送 INVITE,UAS 回 180 Ringing,首次 tid 雙方皆為 1。UAS 重啟後,UAS 端 tid=1,但 UAC 收到的 tid=2。

根因

eXosip 內部事務層(Transaction Layer)根據 Call-ID、CSeq、Via 分支識別事務。UAS 重啟後記憶體狀態重置,但網路對端(UAC)仍保留舊事務狀態,導致雙方事務 ID 不同步。

應用層解決策略

  1. 收到請求時,提取 Call-ID 標頭。
  2. 維護 Map<String, Long> callIdToTid 記錄本端對應 tid。
  3. 若新請求的 Call-ID 已存在但 tid 不同,判定為舊事務殘留,呼叫 eXosip_transaction_terminate() 銷毀舊事務,重新建立。
  4. 心跳/保活機制(eXosip_automatic_refresh)僅能緩解,無法 100% 保證雙向同步。

關鍵代碼片段

// 應用層比對 Call-ID
String callId = je->request->call_id->value;
Long localTid = map.get(callId);
if (localTid != null && localTid != je->tid) {
    eXosip_transaction_terminate(localTid); // 清理舊事務
}
map.put(callId, je->tid);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved