1. 程式人生 > >eXosip入門(四):eXosip示例程式——註冊/認證 .

eXosip入門(四):eXosip示例程式——註冊/認證 .

 首先建議先看一下我翻譯的文章《eXoisp使用者手冊:1.3 如何傳送或者升級註冊》,先對eXosip的註冊/認證過程有一個大致的瞭解。
     其次,在exosip\tools目錄下有官方提供的一個示例程式sip_reg.c,使用者可以仔細閱讀該原始碼,熟悉exosip註冊API函式的使用及事件的處理流程。

     eXosip基本註冊流程如下:傳送預設註冊請求——>收到註冊失敗事件(缺少認證資訊)——>再次傳送帶認證資訊的註冊請求——>註冊成功。
     注意在呼叫eXosip_register_build_initial_register函式時,該函式會返回一個註冊id,使用者應儲存該id,因為後面更新/取消註冊時要用到。
     
     下圖1為sipReg程式與伺服器的通訊抓包截圖,圖2為通訊流程圖。

                                                                                      圖1

SIP註冊流程圖

                                              圖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事件中增加以下程式碼:

[cpp] view plaincopyprint?
  1. if ((event->response != NULL) && (event->response->status_code == 401)) { // 收到401狀態
  2.     osip_message_t *reg = NULL;  
  3.             eXosip_lock();  
  4.             eXosip_clear_authentication_info(); // 清空認證資訊      
  5.     eXosip_add_authentication_info(username, username, password, 
    "MD5", NULL); // 新增認證資訊
  6.     eXosip_register_build_register(event->rid, expires, &reg);  
  7.     eXosip_register_send_register(event->rid, reg); // 傳送註冊請求
  8.     eXosip_unlock();  
  9. }  
  10. else { // 註冊失敗處理
  11.     ...  
  12. }  
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, &reg);
	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 文件,今天就來講講

JSBasic JavaScript入門--正則

1. Sift through Text with Regular Expressions Regular expressions 正則表示式被用來根據某種匹配模式來尋找strings中的某些單詞。 舉例:如果我們想要找到字串The dog chased the cat中單詞