eXosip入門(四):eXosip示例程式——註冊/認證 .
其次,在exosip\tools目錄下有官方提供的一個示例程式sip_reg.c,使用者可以仔細閱讀該原始碼,熟悉exosip註冊API函式的使用及事件的處理流程。
eXosip基本註冊流程如下:傳送預設註冊請求——>收到註冊失敗事件(缺少認證資訊)——>再次傳送帶認證資訊的註冊請求——>註冊成功。
注意在呼叫eXosip_register_build_initial_register函式時,該函式會返回一個註冊id,使用者應儲存該id,因為後面更新/取消註冊時要用到。
下圖1為sipReg程式與伺服器的通訊抓包截圖,圖2為通訊流程圖。
圖1
圖2
1、客戶端首先發送一條不帶認證資訊的註冊請求;
2、伺服器返回401狀態,即未授權,需要使用者認證;
3、客戶端再次傳送帶認證資訊的註冊請求;
4、伺服器返回200 OK狀態,表明註冊成功。
在eXosip中,當用戶第一次傳送註冊請求後,eXosip會產生EXOSIP_REGISTRATION_FAILURE事件,注意這並不一定是註冊失敗,使用者需要根據event->response->status_code 來判斷具體的狀態,如果是401狀態,則是伺服器需要使用者再次傳送帶認證資訊的註冊請求;如果是其他值,則認為註冊失敗,比如無法連線伺服器等。
對於EXOSIP_REGISTRATION_FAILURE事件,有兩種處理方式:
1、自動處理。
在eXosip事件處理迴圈中呼叫eXosip_automatic_action()函式,該函式會自動幫助使用者處理401/407狀態,使用者並不再需要手動傳送帶認證資訊的註冊請求,只需要在第一次註冊時就新增好認證資訊即可;
2、手動處理,需要在EXOSIP_REGISTRATION_FAILURE事件中增加以下程式碼:
- if ((event->response != NULL) && (event->response->status_code == 401)) { // 收到401狀態
- osip_message_t *reg = NULL;
- eXosip_lock();
- eXosip_clear_authentication_info(); // 清空認證資訊
- eXosip_add_authentication_info(username, username, password,
- eXosip_register_build_register(event->rid, expires, ®);
- eXosip_register_send_register(event->rid, reg); // 傳送註冊請求
- eXosip_unlock();
- }
- else { // 註冊失敗處理
- ...
- }
if ((event->response != NULL) && (event->response->status_code == 401)) { // 收到401狀態
osip_message_t *reg = NULL;
eXosip_lock();
eXosip_clear_authentication_info(); // 清空認證資訊
eXosip_add_authentication_info(username, username, password, "MD5", NULL); // 新增認證資訊
eXosip_register_build_register(event->rid, expires, ®);
eXosip_register_send_register(event->rid, reg); // 傳送註冊請求
eXosip_unlock();
}
else { // 註冊失敗處理
...
}
注意事項:
1、有的SIP伺服器可以設定成不需要使用者註冊即可登陸,所以會導致與上述流程不一樣;
2、eXosip_register_build_initial_register函式的expires引數為註冊過期時間,單位為秒,也就是說過了這段時間,註冊資訊失效,使用者需要重新註冊。
測試程式暫時不知道如何上傳,敬請等待^_^。
相關推薦
eXosip入門(四):eXosip示例程式——註冊/認證 .
首先建議先看一下我翻譯的文章《eXoisp使用者手冊:1.3 如何傳送或者升級註冊》,先對eXosip的註冊/認證過程有一個大致的瞭解。 其次,在exosip\tools目錄下有官方提供的一個示例程式sip_reg.c,使用者可以仔細閱讀該原始碼,熟悉exo
eXosip入門(三):eXosip庫的驗證
本次我們來驗證一下得到的eXosip庫是否可用。 PS:為什麼要驗證呢?不是編譯成庫後就可以直接使用麼?理論上是這樣的,但是現實是殘酷滴,編譯成庫檔案,只是噩夢的開始,學習的道路不會一帆風順。 本次只是驗證eXosip庫是否可用,不需要很
eXosip入門(七):執行緒操作
osip2/eXosip2支援執行緒安全,既可以用於多執行緒的程式設計模式,也可以用於單執行緒的程式設計模式。osip2/eXosip2預設是使用多執行緒模式,也就是預設使能OSIP_MT巨集。 當使用多執行緒模式時,使用者需要編寫執行緒處理函式
人工智慧入門(四):uncertainty&基於統計的學習
1.belief networks (indenpendence, collider,conditioning / marginalization,connection graph,independence in belief networks,D-separation,uncertain and unrel
ADO.NET 快速入門(四):從資料庫填充 DataSet
ADO.NET 快速入門(四):從資料庫填充 DataSet 從資料庫獲取資料很容易,處理資料更容易。如果想要從資料庫獲取只進、只讀的資料流結果集,你可以使用 DataReader 執行命令並且檢索它。關於如何使用 DataReader,請參考:使用 OLE
神經網路(四):應用示例之分類
一、 傳統分類模型的侷限 在之前的文章中(《神經網路(一)》、《神經網路(二)》和《神經網路(三)》),我們討論的重點是神經網路的理論知識。現在來看一個實際的例子,如何利用神經網路解決分類問題。(為了更好地展示神經網路的特點,我們在這個示例中並不劃分訓練集和測
Java入門(四):運算子優先順序、關鍵字與保留字
上次介紹了Java的運算子,今天來介紹下運算子的優先順序,以及Java的關鍵字、保留字。 一、運算子優先順序 序號 運算子 名稱 目數 結合性 說明 1 [ ]
Spring Boot快速入門(四):使用jpa進行資料庫操作
新增依賴 新建專案選擇web,JPA,MySQL三個依賴 對於已存在的專案可以在bulid.gradle加入,spring boot將會幫你自動配置好 compile('org.springframework.boot:spring-boot-starter
Spark入門(四):RDD基本操作
1.RDD轉換 RDD的所有轉換操作都不會進行真正的計算 1.1單個RDD轉換操作 # 建立測試RDD val rdd = sc.parallelize(Array("hello world","java","scala easy")) # 1.
前端零基礎入門(四):第一個HTML頁面
前面說到了html,css,js三者之間的關係 接下來我們就來看看html到底長什麼樣子。 隨便開啟一個編輯器,然後在檔案那裡點選新建html檔案,看到的程式碼大多如下: <!DOCTYPE html> <html lang="en"
JavaFX入門(四):JavaFX佈局(一)
說道GUI程式設計一定要談到佈局,JavaFX內建了大量的佈局控制元件提供給我們使用。其實,JavaFX的佈局控制元件和介面元素控制元件都是繼承自javafx.scene.layout.Region類。我們這裡只看佈局控制元件類。佈局控制元件我們在介面上一般是看
Spring Data REST入門(四):自定義查詢(上)
一、自定義查詢方法 通常會有這樣的需求,根據給定的欄位查詢相應表中的資料物件。比如在前幾篇部落格中定義的User實體來,需要一個按照name值查到與之對應的資料物件返回,只需要在UserRopository中定義如下程式碼: /**
TiDB入門(四):從入門到“跑路”
大小 -a 公司 硬件要求 clas 簡單測試 理由 解決問題 end 前言 前面三章基本把 TiDB 的環境弄好了,也做了一下簡單測試,有興趣的同學可以看一下: TiDB 入門(一):TiDB 簡介 TiDB 入門(二):虛擬機搭建 TiDB-Ansible 部署方案 T
Spring Security 入門(四):自定義-Filter
前文導讀本文解決問題將自定義的 Filter 加入到 Spring Security 中的 Fi
Spring boot 入門(四):集成 Shiro 實現登陸認證和權限管理
orm ger eal ehcache hash 業務邏輯 2個 時間 prot 本文是接著上篇博客寫的:Spring boot 入門(三):SpringBoot 集成結合 AdminLTE(Freemarker),利用 generate 自動生成代碼,利用 DataT
Storm入門(四)WordCount示例
etl rri emit lis auto deb turn output -- Storm API文檔網址如下: http://storm.apache.org/releases/current/javadocs/index.html 一、關聯代碼 使用maven,代碼如
python程式設計:從入門到實踐學習筆記-Django入門(四)
建立其他網頁 我們接下來擴充“學習筆記”專案,建立兩個顯示資料的網頁,其中一個列出所有的主題,另一個顯示特定主題的所有條目。 模板繼承 編寫一個包含通用元素的父模板,並讓每個網頁都繼承這個模板,而不必在每個網頁中重複定義這些通用元素。這樣我們可以專注於開發每個網頁的獨特部分。1.父模板
TensorFlow從入門到理解(四):你的第一個迴圈神經網路RNN(分類例子)
執行程式碼: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # set random seed for comparing the two result calculations
爬蟲入門系列(四):HTML文字解析庫BeautifulSoup
爬蟲入門系列目錄: 系列文章的第3篇介紹了網路請求庫神器 Requests ,請求把資料返回來之後就要提取目標資料,不同的網站返回的內容通常有多種不同的格式,一種是 json 格式,這類資料對開發者來說最友好。另一種 XML 格式的,還有一種最常見格式的是 HTML 文件,今天就來講講
JS:Basic JavaScript入門(四)--正則
1. Sift through Text with Regular Expressions Regular expressions 正則表示式被用來根據某種匹配模式來尋找strings中的某些單詞。 舉例:如果我們想要找到字串The dog chased the cat中單詞