分类: 网络通信预览模式: 普通 | 列表

Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流。

 

长轮询长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。

iframe流iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

查看更多...

Tags: Comet HTTP

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 901

pjsip中播放wav文件流程

typedef struct
{
    pjsua_conf_port_id call_port;
    pjsua_conf_port_id player_port;
    pjsua_player_id player_id;

查看更多...

Tags: pjsip pjsua_player_destroy

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1275
SIP类似Http协议。其认证模式也一样。Http协议(RFC 2616 )规定可以采用Basic模式和摘要模式(Digest schema)。RFC 2617 专门对两种认证模式做了规定。RFC 1321 是MD5标准。Digest对现代密码破解来说并不强壮,但比基本模式还是好很多。



1、基本认证模式

查看更多...

Tags: sip Basic模式 Digest 摘要模式

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1522

Win Socket I/O模型 详解

本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教。

    一:select模型
    二:WSAAsyncSelect模型
    三:WSAEventSelect模型
    四:Overlapped I/O 事件通知模型
    五:Overlapped I/O 完成例程模型
    六:IOCP模型

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。
    这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket I/O模型~~~

一:select模型

查看更多...

Tags: Socket Select IOCP

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 330
采取PJSIP源码连接IMS服务器抓包RTP协议时候发现报错IP Checksum Offload ,由于系统采取双卡的,我本机测试都是正常的,一直很纳闷。通过找资料,这样修改了就ok了



查看更多...

Tags: pjsip UDP Checksum Offload

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1698

PJSIP简介配置和PJLIB基础库的使用

PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.
 
1.PJSIP库的主要特征:
1).极具移植性.(Extremely portable)
   当前可支持平台包括:
   * Win32/x86 (Win95/98/ME, NT/2000/XP/2003, mingw).
   * arm, WinCE and Windows Mobile.
   * Linux/x86, (user mode and as kernel module(!)).
   * Linux/alpha
   * Solaris/ultra.
   * MacOS X/powerpc
   * RTEMS (x86 and powerpc).
   * Symbian OS
2).非常小的足印.(Very small footprint)
   官方宣称编译后的库<150Kb,我在PC上编译后加上strip后概173Kb,这对于嵌入
   式设备,是个好消息
3).高性能.(High performance)
   这点我们后面可以看看是否如作者宣称的
 
2. PJSIP的组成.
其实说是PJSIP不是特别贴切,这个库实际上是几个部分组成的.
1).PJSIP - Open Source SIP Stack[开源的SIP协议栈]
2).PJMEDIA - Open Source Media Stack[开源的媒体栈]
3).PJNATH - Open Source NAT Traversal Helper Library[开源的NAT-T****库]
4).PJLIB-UTIL - Auxiliary Library[****工具库]
5).PJLIB - Ultra Portable Base Framework Library[基础框架库]
    PJLIB-UTIL****工具库:加解密MD5和CRC32的算法
    PJNATH开源的NAT库包含ICE打洞
    PJSUA-LIB库:最顶层的SIP库支持VOIP
    PJMEDIA库:最顶层的支持视频的库
 
3. PJLIB基础框架库提供的功能:
1).内存的处理、数据的存储
   .数据结构的(hash表、link表、二叉树、等)
   .caching和pool;缓冲池和内存池
2).OS抽象
   .线程、互斥、临界区、锁对象、事件对象
   .定时器
   .pj_str_t字符串
3).操作系统级别的函数抽象
   .socket的抽象(tcp/udp)
   .文件的读写
4).使用前的初始化,使用后的清理
 
4.PJSIP的安装和配置:
1.安装和编辑pjsip库:
A.将pjproject-1.5.zip和DirectX-Lib.rar解压到当前目录的pjlib路径下;
B.查看pjlib\pjproject-1.5\pjlib\include\pj下面是否有config_site.h,如果没有建一个空文件
C.将DirectX的x86的lib库拷贝到C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib
D.在环境变量中设置DXSDK_DIR=direx中的include目录
E.首先编译pjlib\pjproject-1.5\pjproject-vs8.sln [win32]
F.然后打开工程开始编译
2.脱离pjsip环境的工程的配置
需要头文件的可以加入
$(SolutionDir)pjlib\pjproject-1.5\pjlib\include
$(SolutionDir)pjlib\pjproject-1.5\pjlib-util\include
$(SolutionDir)pjlib\pjproject-1.5\pjnath\include
$(SolutionDir)pjlib\pjproject-1.5\pjsip\include
$(SolutionDir)pjlib\pjproject-1.5\pjmedia\include
如果需要lib库文件的加入
$(SolutionDir)pjlib\pjproject-1.5\pjlib\lib
$(SolutionDir)pjlib\pjproject-1.5\pjlib-util\lib
$(SolutionDir)pjlib\pjproject-1.5\pjnath\lib
$(SolutionDir)pjlib\pjproject-1.5\pjsip\lib
$(SolutionDir)pjlib\pjproject-1.5\pjmedia\lib
$(SolutionDir)pjlib\pjproject-1.5\lib
我的程序所依赖PJLIB的库有:
pjlib-i386-Win32-vc8-Debug.lib
pjlib-util-i386-Win32-vc8-Debug.lib
pjnath-i386-Win32-vc8-Debug.lib
pjsip-core-i386-Win32-vc8-Debug.lib
pjsip-simple-i386-Win32-vc8-Debug.lib
pjsip-ua-i386-Win32-vc8-Debug.lib
pjsua-lib-i386-Win32-vc8-Debug.lib
pjmedia-audiodev-i386-Win32-vc8-Debug.lib
pjmedia-codec-i386-Win32-vc8-Debug.lib
pjmedia-i386-Win32-vc8-Debug.lib
libpjproject-i386-Win32-vc8-Debug.lib
1.使用前的初始化和使用后的清理
PJSIP库里面封装了很多线程内存池;而且很多对象都是基于内存池创建的,所以几乎所以的库都需要初始化或创建
下面是pjlib,pjlib-util,pjnath,pjsua-lib库的初始化和关闭
显示行号 复制代码  这是一段程序代码。
  1. pj_status_t status;
     
  2. status = pj_init();         //初始化pjlib库返回PJ_SUCCESS表示成功
  3. status = pjlib_util_init(); //初始化pjlib-util库
  4. status = pjnath_init();     //初始化pjnath库
  5. status = pjsua_create();    //初始化pjsua-lib库;(里面初始化了pjlib,pjlib-util,pjnath) 
  6.  
  7. pj_shutdown();    //pjlib停止
  8. pjsua_destroy();  //pjsua-lib库的清理
    •  

 

 
 
2.缓冲池和内存池(caching,pool)
pjsip的内存池的使用规则:
每个内存池都是基于内存池工厂创建的;pjsip有一个默认的内存池工厂pj_caching_pool;
我喜欢把它叫做缓冲池;将来清理内存池的时候,可以关闭内存池也可直接关闭缓冲池;
    pj_caching_pool cp;
    pj_caching_pool_init(&cp, NULL, 1024*1024 );       //缓冲池
    pj_caching_pool_destroy(&cp); //释放工厂
    pj_pool_t pool = pj_pool_create(&cp.factory, "name", 1024, 1024, NULL); //创建内存池
    pj_pool_release(&pool); //释放内存池到工厂中,直接释放工厂可省略这一步
    void* p = pj_pool_alloc(pool, size); //在内存中开辟一个空间
    注:适当的初始化大小;内存池只能增加不能减小
    由于pjlib很多内部对象都用内存池,所以在对象释放之前不能释放内存池。
使用缓冲池和内存池
  1. //系统初始化的时候调用
     
  2. void create()
    
  3. {
    
  4. //初始化pjlib库返回PJ_SUCCESS表示成功
    
  5. pj_status_t status = pj_init(); 
    
  6.  
  7. pj_caching_pool_init(&this->m_caching, NULL, 0);
    
  8. this->m_pool = pj_pool_create(&this->m_caching.factory, "", 256, 256, NULL);
    
  9.  
  10.  //初始化mutex
    
  11. pj_mutex_create(this->m_pool, "", PJ_MUTEX_SIMPLE, &this->m_pool_mutex);
    
  12.  
  13.  //创建一个lock给定时器用
    
  14. pj_lock_create_simple_mutex(this->m_pool, "timer_lock", &this->timer_heap_lock);
    
  15.  
  16.  //在内存池上开辟一块空间
    
  17. char *pmem = (char*)pj_pool_alloc(this->m_pool, 1024); 
    
  18.  
  19.  //创建一个定时器堆
    
  20. pj_timer_heap_create(this->m_pool, MAX_TIMER_COUTN, &this->timer_heap);
    
  21.  
  22.  //给定时器加锁; 将来自动删除该锁,无需手工删除
    
  23. pj_timer_heap_set_lock(this->timer_heap, this->timer_heap_lock, true);
    
  24.  }
    
  25.  
  26.  //系统退出的时候调用
    
  27. void destroy()
    
  28.  {
    
  29.  //删除mutex
    
  30. pj_mutex_destroy(this->m_pool_mutex);
    
  31.  
  32.  //删除定时器的堆
    
  33. pj_timer_heap_destroy(this->timer_heap);
    
  34.  
  35.  //清理内存池,这一步也可以删略;让caching_pool来清理
    
  36. pj_pool_destroy_int(this->m_pool); 
    
  37.  
  38.  //清理缓冲池;所有在缓冲池建立的内存池都会被清理掉
    
  39. pj_caching_pool_destroy(&this->m_caching);
    
  40.  
  41.  //pjlib停止
    
  42. pj_shutdown();
    
  43.  }
    
  44.  

 

 

 
3.线程的介绍,及其线程的封装和使用
1.外部函数或线程使用到pjsip的时候,必须注册线程
 
隐藏行号 复制代码  注册线程
  1. pj_thread_desc desc;
     
  2. pj_bzero(desc, sizeof(desc));
    
  3. pj_thread_t *thread_;
    
  4. if (pj_thread_register("", desc, &thread_) != PJ_SUCCESS) 
    
  5.     return 0; /* 失败*/ 
    
  6.  

function CopyCode(key){var codeElement=null;var trElements=document.all.tags("ol");var i;for(i=0;i

 
 
2.线程的创建和使用
pj_thread_create(pool*,"", function, *arg, stack_size, flag, **pj_thread_t)//创建一个线程
pj_thread_destroy(thread); //注销一个线程
pj_thread_resume(thread); //线程继续
pj_thread_sleep(1500);      //当前的线程暂停1500毫秒
pj_thread_join(thrad);       //等待线程结束
pj_thread_proc函数原型是int thread_func(void * argv);


3.对pjlib的thread的线程的封装
1: class CSipThread
 
   2: {
   3:     //1.实现一个int ()(void*)的函数,且在结束的地方设置m_thread_t=NULL
   4:     pj_thread_t *m_thread_t;
   5: protected:
   6:  
   7:     /* int (pj_thread_proc)(void*);
   8:     * 线程函数;子类需要使用static函数来实现
   9:     * 子类函数中在结束的时候:必须将m_thread_t = NULL;
  10:     */
  11:     pj_thread_proc *m_thread_function;
  12:  
  13:     /* 这个是实现函数;
  14:     * 子类需要实现一个run()的函数;在run函数中调用run_父类的函数
  15:     */
  16:     virtual void run_(pj_pool_t *pool, pj_thread_proc *function);
  17: public:
  18:     CSipThread();
  19:     virtual ~CSipThread();
  20:     virtual bool thread_running();
  21:  
  22:     //等待线程结束,自动释放资源,且会将m_thread_t=NULL
  23:     virtual void thread_join();
  24:  
  25:     //在线程自己退出的时候,没有需要手工释放资源,和设置m_thread_t=NULL
  26:     virtual void thread_destroy();
  27: };
  28: CSipThread::CSipThread()
  29: {
  30:     this->m_thread_t = NULL;
  31: }
  32: CSipThread::~CSipThread()
  33: {
  34:  
  35: }
  36: void CSipThread::run_(pj_pool_t *pool, pj_thread_proc *function)
  37: {
  38:     if ( this->thread_running())
  39:         return;
  40:     pj_status_t status = pj_thread_create(pool, "", function, this, 
  41:         PJ_THREAD_DEFAULT_STACK_SIZE, NULL, &this->m_thread_t);
  42:     if (status != PJ_SUCCESS)
  43:     {
  44:         CFunctions::write_log(LM_ERROR, "Can't create timer thread. [result=%d]..\n", status);
  45:     }
  46: }
  47: bool CSipThread::thread_running()
  48: {
  49:     if (this->m_thread_t == NULL)
  50:         return false;
  51:     else
  52:         return true;
  53: }
  54:  
  55: void CSipThread::thread_join()
  56: {
  57:     if (this->m_thread_t == NULL)
  58:         return;
  59:  
  60:     // 等待线程结束
  61:     pj_thread_join(this->m_thread_t);
  62: }
  63:  
  64: void CSipThread::thread_destroy()
  65: {
  66:     pj_thread_destroy(this->m_thread_t);
  67:     this->m_thread_t = NULL;
  68: }

 


4.使用封装起来的thread线程对象

 
1: /* 使用封装后的线程注意事项
 
   2: * 1. 必须定义一个static的静态函数
   3: * 2. 在静态函数结束的时候必须调用thread_destroy();
   4: */
   5: class CSendThread : public CSipThread
   6: {
   7:     //线程函数;在函数退出的时候必须调用thread_destroy();
   8:     static int thread_func(void * argv);
   9: public:
  10:     CSendThread(void);
  11:     virtual ~CSendThread(void);
  12:  
  13:     //再次封装了run_函数
  14:     void run();
  15: }
  16:  
  17: void CSendThread::run()
  18: {
  19:     if ( this->thread_running())
  20:         return;
  21:  
  22:     SIP_GUARD(CInterFace::instance()->m_pool_mutex, obj);
  23:  
  24:     //调用父类的run_函数进行创建函数,开始运行;注意如果线程已经存在,那么直接返回
  25:     //不会再创建一个线程
  26:     this->run_(CInterFace::instance()->m_pool, &CSendThread::thread_func);
  27: }
  28:  
  29: int CSendThread::thread_func(void * argv)
  30: {
  31:     // 线程函数的参数默认是当前对象,等同于this指针
  32:     CSendThread *this_thread = (CSendThread*)argv;
  33:  
  34: thread_end:
  35:     // 在线程结束的时候,一定要调用thread_destroy();来删除线程
  36:     this_thread->thread_destroy();
  37:     return 0;
  38: }

 

查看更多...

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 4695

TCP/IP四层模型与OSI七层模型的对比

我们把OSI七层网络模型和Linux TCP/IP四层概念模型对应,然后将各种网络协议归类。
 

查看更多...

Tags: 网络模型 应用层 表示层 网络层

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 404

MTU

1500字节: 以太网.
1492字节: PPPoE
1472字节: ping
1468字节: DHCP
1430字节: VPN and PPTP
576字节: 拨号ISP

查看更多...

Tags: MTU UDP TCP 以太网 PPPoE RFC 路由

分类:网络通信 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1592