PJSIP基础库使用

来源:互联网 发布:人工翻译软件 编辑:程序博客网 时间:2024/05/14 23:49

http://blog.csdn.net/sunlion81/article/details/8844206 等



数据结构之循环链表的使用:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <pjlib.h>  
  3. #include <pj/types.h> // for pj_init.  
  4.   
  5. #define THIS_FILE "main.c"  
  6.   
  7. typedef struct MY_NODE  
  8. {  
  9.     // This must be the first member declared in the struct!  
  10.     PJ_DECL_LIST_MEMBER(struct MY_NODE);  
  11.     int val;  
  12. } MY_NODE;  
  13.   
  14. /* 
  15. 循环链表测试 
  16. */  
  17. void list_test(void);  
  18.   
  19. /* 
  20. 打印循环链表信息 
  21. */  
  22. void list_print(pj_list_type* node);  
  23.   
  24.   
  25. int main(int argc, char** argv)  
  26. {  
  27.     pj_status_t status;  
  28.   
  29.     // pjlib库初始化  
  30.     status = pj_init();  
  31.     if (status != PJ_SUCCESS)  
  32.     {  
  33.         char errmsg[PJ_ERR_MSG_SIZE];  
  34.         pj_strerror(status, errmsg, sizeof(errmsg));  
  35.         PJ_LOG(1,(THIS_FILE, "%s: %s [status=%d]", pj_init, errmsg, status));  
  36.         return -1;  
  37.     }  
  38.   
  39.     // 循环链表测试  
  40.     list_test();  
  41.   
  42.     // pjlib库关闭  
  43.     pj_shutdown();  
  44.   
  45.     return 0;  
  46. }  
  47.   
  48. /* 
  49. 循环链表测试 
  50. */  
  51. void list_test(void)  
  52. {  
  53.     int i;  
  54.     MY_NODE list;  
  55.     MY_NODE array[10];  
  56.   
  57.     // 初始化一个空链表  
  58.     pj_list_init(&list);  
  59.   
  60.     // 向链表插入节点  
  61.     for (i=0; i<10; ++i)  
  62.     {  
  63.         array[i].val = i;  
  64.         pj_list_insert_before(&list, &array[i]);  
  65.     }     
  66.   
  67.     // 打印循环链表信息  
  68.     list_print(&list);  
  69.   
  70.     // 删除链表中的节点  
  71.     for (i=0; i<10; ++i)  
  72.     {  
  73.         pj_list_erase(&array[i]);  
  74.     }     
  75.   
  76.     // 打印循环链表信息  
  77.     list_print(&list);  
  78.   
  79.     // 检查链表是否为空  
  80.     pj_assert(pj_list_empty(&list));  
  81.   
  82. }  
  83.   
  84. /* 
  85. 打印循环链表信息 
  86. */  
  87. void list_print(pj_list_type* node)  
  88. {  
  89.     int i;  
  90.     MY_NODE *it;  
  91.     MY_NODE *head;    
  92.   
  93.     head = it = (MY_NODE *)node;  
  94.   
  95.     if (it != NULL)  
  96.     {  
  97.         it = it->next;  
  98.         for (i=0; it != head; ++i)  
  99.         {  
  100.             PJ_LOG(3, (THIS_FILE, "node[%d] = %d", i, it->val));  
  101.             it = it->next;  
  102.         }  
  103.     }     
  104. }  

数据结构之数组的使用:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <pjlib.h>  
  3. #include <pj/types.h> // for pj_init.  
  4.   
  5. #define THIS_FILE "main.c"  
  6.   
  7. /* 
  8. 数组测试 
  9. */  
  10. void array_test(void);  
  11.   
  12. static pj_status_t matching_cb(const void *value);  
  13.   
  14. int main(int argc, char** argv)  
  15. {  
  16.     pj_status_t status;  
  17.   
  18.     // pjlib库初始化  
  19.     status = pj_init();  
  20.     if (status != PJ_SUCCESS)  
  21.     {  
  22.         char errmsg[PJ_ERR_MSG_SIZE];  
  23.         pj_strerror(status, errmsg, sizeof(errmsg));  
  24.         PJ_LOG(1,(THIS_FILE, "%s: %s [status=%d]", pj_init, errmsg, status));  
  25.         return -1;  
  26.     }  
  27.   
  28.     // 数组测试  
  29.     array_test();  
  30.   
  31.     // pjlib库关闭  
  32.     pj_shutdown();  
  33.   
  34.     return 0;  
  35. }  
  36.   
  37. /* 
  38. 数组测试 
  39. */  
  40. void array_test(void)  
  41. {  
  42.     char a = '@';  
  43.     char* p = NULL;  
  44.     char array[32] = "abc123";    
  45.   
  46.     PJ_LOG(3, (THIS_FILE, "array = %s", array));  
  47.   
  48.     // 向数组中特定位置插入一个元素  
  49.     pj_array_insert(array, sizeof(char), (unsigned)strlen(array), 3, &a);  
  50.     PJ_LOG(3, (THIS_FILE, "array = %s", array));  
  51.   
  52.     // 删除数组中特定位置的一个元素  
  53.     pj_array_erase(array, sizeof(char), (unsigned)strlen(array), 3);  
  54.     array[strlen(array)-1] = '\0';  
  55.     PJ_LOG(3, (THIS_FILE, "array = %s", array));  
  56.   
  57.     // 查找数组中的特定元素  
  58.     pj_array_find(array, sizeof(char), (unsigned)strlen(array), matching_cb, &p);  
  59. }  
  60.   
  61. static pj_status_t matching_cb(const void *value)  
  62. {  
  63.     char *p = (char*)value;  
  64.   
  65.     PJ_LOG(3, (THIS_FILE, "*p = %s", p));  
  66.   
  67.     // 具体匹配的代码需要自行编写  
  68.   
  69.     return PJ_SUCCESS;  
  70. }  
数据结构之字符串的使用:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <pjlib.h>  
  3. #include <pj/types.h> // for pj_init.  
  4.   
  5. #define THIS_FILE "main.c"  
  6.   
  7. /* 
  8. 字符串 
  9. struct pj_str_t 
  10. { 
  11.     char       *ptr; 
  12.     pj_ssize_t  slen; 
  13. }; 
  14. */  
  15.   
  16. /* 
  17. 字符串测试 
  18. */  
  19. void string_test(void);  
  20.   
  21. int main(int argc, char** argv)  
  22. {  
  23.     pj_status_t status;  
  24.   
  25.     // pjlib库初始化  
  26.     status = pj_init();  
  27.     if (status != PJ_SUCCESS)  
  28.     {  
  29.         char errmsg[PJ_ERR_MSG_SIZE];  
  30.         pj_strerror(status, errmsg, sizeof(errmsg));  
  31.         PJ_LOG(1,(THIS_FILE, "%s: %s [status=%d]", pj_init, errmsg, status));  
  32.         return -1;  
  33.     }  
  34.   
  35.     // 字符串测试  
  36.     string_test();  
  37.   
  38.     // pjlib库关闭  
  39.     pj_shutdown();  
  40.   
  41.     return 0;  
  42. }  
  43.   
  44. /* 
  45. 字符串测试 
  46. */  
  47. void string_test(void)  
  48. {  
  49.     {  
  50.         // char ==> pj_str_t  
  51.         pj_str_t str;  
  52.         str = pj_str("Hello PJ_STR_T!");  
  53.         PJ_LOG(3, (THIS_FILE, "str = %.*s", str.slen, str.ptr));  
  54.     }  
  55.   
  56.     {  
  57.         // pj_str_t ==> char  
  58.         pj_str_t str;  
  59.         char buffer[256];  
  60.           
  61.         // 使用C字符串产生常量字符串  
  62.         pj_cstr(&str, "Hello C char!");  
  63.   
  64.         memset(buffer, 0, sizeof(buffer));  
  65.         strncpy(buffer, str.ptr, str.slen);  
  66.   
  67.         PJ_LOG(3, (THIS_FILE, "buffer = %s", buffer));  
  68.     }  
  69.   
  70.     {  
  71.         // 无符号整数转换成字符串  
  72.         char buffer[256];  
  73.         unsigned val = 123456;  
  74.           
  75.         memset(buffer, 0, sizeof(buffer));  
  76.         pj_utoa(val, buffer);  
  77.   
  78.         PJ_LOG(3, (THIS_FILE, "val[%d] => buffer[%s]", val, buffer));  
  79.     }  
  80.   
  81.     {  
  82.         // 将字符串转换为无符号整数  
  83.         unsigned val;  
  84.         pj_str_t str;  
  85.   
  86.         str = pj_str("9367");  
  87.         val = pj_strtoul(&str);  
  88.   
  89.         PJ_LOG(3, (THIS_FILE, "str[%.*s] => val[%d]", str.slen, str.ptr, val));  
  90.     }  
  91.   
  92.     {  
  93.         // 删除字符串头尾空白符  
  94.         pj_str_t str;  
  95.         str = pj_str("  a b c 1 2 3 ");  
  96.         PJ_LOG(3, (THIS_FILE, "str[%.*s]", str.slen, str.ptr));  
  97.         pj_strtrim(&str);  
  98.         PJ_LOG(3, (THIS_FILE, "str[%.*s]", str.slen, str.ptr));  
  99.     }  
  100. }  
初始化与缓冲池和内存池的使用:

[cpp] view plaincopy
  1. #include <stdio.h>  
  2. #include <pjlib.h>  
  3. #include <pj/types.h> // for pj_init.  
  4.   
  5. #define THIS_FILE "main.c"  
  6.   
  7. int main(int argc, char** argv)  
  8. {  
  9.     pj_status_t status;  
  10.     pj_caching_pool ch_pool;  
  11.   
  12.     // pjlib库初始化  
  13.     status = pj_init();  
  14.     if (status != PJ_SUCCESS)  
  15.     {  
  16.         char errmsg[PJ_ERR_MSG_SIZE];  
  17.         pj_strerror(status, errmsg, sizeof(errmsg));  
  18.         PJ_LOG(1,(THIS_FILE, "%s: %s [status=%d]", pj_init, errmsg, status));  
  19.         return -1;  
  20.     }  
  21.   
  22.     // pjlib创建缓冲池工厂  
  23.     pj_caching_pool_init(&ch_pool, NULL, 1024*1024);  
  24.   
  25.     /* 分配内存示例 */  
  26.     {  
  27.         pj_pool_t *pool;  
  28.         pj_pool_factory *factory =&ch_pool.factory;  
  29.   
  30.         // 在分配内存前必须创建内存池  
  31.         pool = pj_pool_create(factory, "pjlib_demo", 4*1024, 4*1024, NULL);  
  32.         if (pool == NULL)  
  33.         {  
  34.             PJ_LOG(1,(THIS_FILE, "Error:pj_pool_create is NULL."));  
  35.             return PJ_ENOMEM;  
  36.         }  
  37.   
  38.         // 循环申请内存  
  39.         {  
  40.             int i;  
  41.             for (i=0; i<1000; i++)  
  42.             {  
  43.                 void* p;  
  44.                 p = pj_pool_alloc(pool, (pj_rand()+1) % 512);  
  45.             }  
  46.   
  47.             // 没有释放内存的函数!!!  
  48.         }  
  49.   
  50.         // 释放内存池  
  51.         pj_pool_release(pool);  
  52.     }  
  53.   
  54.     // pjlib销毁缓冲池工厂  
  55.     pj_caching_pool_destroy(&ch_pool);  
  56.   
  57.     // pjlib库关闭  
  58.     pj_shutdown();  
  59.   
  60.     return 0;  
  61. }  
获得当前时间:

  1. // 获得当前时间  
  2. pj_time_val tv;  
  3. pj_parsed_time pt;  
  4.   
  5. pj_gettimeofday(&tv);  
  6. pj_time_decode(&tv, &pt);  
  7. PJ_LOG(3,(THIS_FILE,  
  8.     "...%04d-%02d-%02d %02d:%02d:%02d.%03d",  
  9.     pt.year, pt.mon, pt.day,  
  10.     pt.hour, pt.min, pt.sec, pt.msec));  














0 0
原创粉丝点击