2011年9月9日
摘要: 总结每个 SIP 计时器的缺省值,RFC 3261一节描述计时器及其含义。定时器 缺省值 节 含义T1 500 ms 17.1.1.1 经历来回时间(RTT)T2 4 秒 17.1.2.2 非 INVITE 请求和 INVITE 响应的最长重新传输时间间隔T4 5 秒 17.1.2.2 消息可保留在网络中的最长持续时间计时器 A 最初为 T1 17.1.1.2 INVITE 请求重新传输时间间隔(仅适用于 UDP)计时器 B 64*T1 17.1.1.2 INVITE 事务超时计时器计时器 D 大于 32 秒(对于 UDP) 17.1.1.2 响应重新传输的等待时间 0 秒(对于 TCP 和 阅读全文
posted @ 2011-09-09 17:49 顾文锦 阅读(640) 评论(0) 推荐(0) 编辑
  2011年6月20日
摘要: 将Sip协议栈分为四层:事务用户层(TU)、事务层、传输层、消息编解码层。如下图所示:传输层采用异步Socket实现,为了防止内存碎片和提高处理速度使用了缓冲池和对象池;事务层使用.net的线程池对事务并行处理;消息编解码层采用延迟解析策略,即用到某个字段时再解析,提高响应速度。 阅读全文
posted @ 2011-06-20 19:52 顾文锦 阅读(985) 评论(0) 推荐(0) 编辑
摘要: 一、OpenLDAP安装和配置LDAP目录以树状的层次结构来存储数据,最顶层即根部称作“基准DN”,形如"dc=mydomain,dc=org"或者"o=mydomain.org",OpenLDAP同时支持两种方式。我们采用前一种方式。具体安装配置过程不详述,在该过程中出现的问题一般与配置文件有关,如果出现问题请仔细检查slapd.conf文件。二、LDAP客户端工具非Java用户推荐使用LdapAdmin、Softerra LDAP Administrator,Java用户推荐LdapBrowser。输入用户名时的输入格式为:cn=Manager,dc 阅读全文
posted @ 2011-06-20 19:11 顾文锦 阅读(4623) 评论(3) 推荐(1) 编辑
  2011年6月16日
摘要: 本例子是一个基本的SIP四边传送,U1->P1->P2->U2,使用proxy来传送。摘自RFC3261。F1 INVITE Alice -> atlanta.com proxyINVITE sip:bob@biloxi.com SIP/2.0Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8Max-Forwards: 70To: Bob <sip:bob@biloxi.com>From: Alice <sip:alice@atlanta.com>;tag=1928301774Call- 阅读全文
posted @ 2011-06-16 08:49 顾文锦 阅读(1124) 评论(0) 推荐(1) 编辑
  2011年6月10日
摘要: 1 general-header类:为描述消息基本属性的通用头域,可用于请求消息或响应消息;通用头域的域名只有在协议版本改变时才可有效地扩展。不过,通信中的所有方均认为是“通用头域”的新的头域也可认为是通用头域。不被认可的头域作为实体头域。1.1Call-IDCall-ID通用头域唯一标识一个特定的请求或者一个特定客户的所有登记。来自同一个客户的所有的登记应该使用同样的Call-ID头值,至少是在同一个重新启动的循环中。注意到单个的多媒体会议会产生不同Call-ID的几个呼叫,例如,用户多次邀请一个单个的私人加入同一个会议。对于一个INVITE请求。主叫方用户代理服务器不应该警告用户,如果用户 阅读全文
posted @ 2011-06-10 09:40 顾文锦 阅读(2320) 评论(0) 推荐(0) 编辑
  2011年4月20日
摘要: 通过上一篇我们已经可以拦截WCF消息,现在我们可以利用该功能实现操作用户身份信息的传播。实现思路为:1、客户端调用WCF服务时拦截客户端消息,在消息头中附加操作者的身份信息;2、服务端收到消息后,从消息头中取出身份信息。其中用户身份可以保存在应用程序域的Iprincipal中,如下所示: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); IIdentity identity = new GenericIden 阅读全文
posted @ 2011-04-20 11:31 顾文锦 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 有两种方式可以扩展WCF:定制行为、定制绑定。行为用来控制内部的通信方法,绑定元素用来创建控制外部通信方法的信道。具体来讲,在WCF的客户端,行为用来修改某些组件的操作,这些组件主要负责将发送的数据序列化在消息中,以及反序列化响应;在WCF的服务端,行为用来修改调度器组件(dispatcher)的功能。(以上为《WCF3.5揭秘》中的原话)定制行为的类型包括操作选择器、参数检查器、消息格式器、消息检查器四种。操作选择器返回处理消息的操作;参数检查器可以修改调用的参数;消息格式器负责将接收的消息反序列化以及将要发送的消息序列化;消息检查器可以在消息通过终结点的时候操作和修改消息。根据以上描述,我 阅读全文
posted @ 2011-04-20 11:24 顾文锦 阅读(559) 评论(0) 推荐(0) 编辑
  2011年4月14日
摘要: 对Prism的介绍园子里已经有很多人介绍了,这里就不再班门弄斧了。只着重介绍一下自己使用Prism构建的一个Wpf程序的设计方案,也请大家不吝指教。按照模式实践小组的介绍,Prism框架+MVVM模式也许是WPF程序开发的首选方案,因此我们在项目中使用了Prism4+MVVM模式+AcalonDock控件的设计方案。1、Prism的使用Prism的使用类似于Asp.net中的母版和用户控件的使用,首先有一个Shell作为母版,然后再母版中可以放入一些Region作为占位符,这些Region与一个用户控件关联,在Shell运行时会将这些用户控件动态添加到对应的Region所在的位置。这样做的一个 阅读全文
posted @ 2011-04-14 18:19 顾文锦 阅读(777) 评论(2) 推荐(0) 编辑
  2011年4月12日
摘要: 最近开发的一个项目中我们使用了微软模式实践小组的Prism框架(后续会发布一些学习心得),该框架提供了MVVM模式的一种实践方式。在MVVM模式中View的事件的响应一般通过Command可以实现,在无法使用Command实现时也可以使用附加属性(Attached Properties)实现。下面贴一段代码,用来响应ListView的拖放事件。在ViewModel中定义附加属性:public static bool GetHandleDragEvent(DependencyObject obj) { return (bool)obj.GetValue(HandleDragEventProper 阅读全文
posted @ 2011-04-12 14:16 顾文锦 阅读(777) 评论(1) 推荐(0) 编辑
摘要: 最近在开发一个项目时,需要在WPF窗体中嵌入Winform控件,在尝试从WPF控件拖放到Winform控件时遇到了一些问题,现将问题和解决方法总结如下:1、如果自定义了拖拽实体类,如 public class DragObject { public string Name { get; set; } }应在类定义前加[Serializable]特性标记,否则在目标方接收数据时会提示“未将对象引用设置到对象实例”2、在Winform端有时会出现不触发DragDrop事件的情况,该情况下应先触发DragEnter事件,在DragEnter事件中修改拖放效果,如e.Effect = DragDro. 阅读全文
posted @ 2011-04-12 09:16 顾文锦 阅读(849) 评论(0) 推荐(0) 编辑