1. RFC
RFC 1701 — Generic Routing Encapsulation (GRE) (INFORMATIONAL)
RFC 1702 — Generic Routing Encapsulation over IPv4 networks (INFORMATIONAL)
RFC 2784 — Generic Routing Encapsulation (GRE) (PROPOSED STANDARD - Updated by RFC 2890)
RFC 2890 — Key and Sequence Number Extensions to GRE (PROPOSED STANDARD)
2. RFC 1701 关键点
2.1 GRE是一个通用封装协议,GRE 协议只关心Header里头的flags, version, protocol type等域,其它如Key, Sequence Number, Routing 等域与应用相关,由具体应用决定它们的含义。
2.2 Routing. Routing信息包含在Source Route Entry (SRE) list中,每个SRE可以包含多个地址信息,一个GRE包可以包含多个SRE. 如果Routing信息存在的话,外层协议需要根据SRE list中指示的信息,依次路由。
如果SREs的Address Family是0x800(IP),则SRE的Routing Information域由一系列的IP地址组成。
Wednesday, November 3, 2010
Thursday, October 21, 2010
Singleton模式
1. 优点(相比于全局变量):
1.1 避免污染全局空间。
1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。
1.3 允许更灵活的实现策略。
2 缺点:
2.1 构造函数没法传递参数。
2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。
2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
http://www.ibm.com/developerworks/java/library/j-dcl.html
1.1 避免污染全局空间。
1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。
1.3 允许更灵活的实现策略。
2 缺点:
2.1 构造函数没法传递参数。
2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。
2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
http://www.ibm.com/developerworks/java/library/j-dcl.html
Monday, October 18, 2010
Type Container of Meta-programming
1. boost::tuple
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
TypeAt
IndexOf
Append
Erase
Replace
为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element< N, lmp::tuple >将返回lmp::null_type,而不是像boost::element < N, boost::tuple >那样由编译器报一个编译错误。
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
<TypeList >TypeAt
<TypeList, N >IndexOf
<TypeList, T >Append
<TypeList, T >Erase
<TypeList, T >Replace
<TypeList, T, U >为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
Sunday, September 19, 2010
Win32 GUI
1. Window概述
1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。
1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。
1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
1.2.2 客户区由应用程序管理,用于显示图形和文字信息。
1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。
1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.
Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。
2. 创建window
2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class
2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。
2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.
2.4 处理消息循环
2.5 销毁window (DestroyWindow() ).
3. Window类型
在调用 CreateWindowEx()函数时给dwStyle设置合适的值
3.1 Overlapped Windows: 一种 "top-level"的窗口, 通常用作应用程序的主窗口。
基本风格: title bar, border, and client area (WS_OVERLAPPED)
可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)
3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
基本风格: border and client area(WS_POPUP)
可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.
3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up
window, 或另外一个child window。Child Window必须有父窗口。
基本风格:不带任何窗口元素(WS_CHILD)
可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
子窗口的几个重要属性:
3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。
3.4 其它特色窗口类型
3.4.1 Layered Windows: 一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
4. Windows的主从关系(Owned window and Owner window)
主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。
4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).
4.2 有主从关系的windows有下列一些约束:
4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
4.2.2 当主窗口销毁时,从窗口自动销毁
4.2.3 当主窗口最小化时,从窗口自动隐藏
1.1 Desktop Window: 操作系统启动时自动创建的窗口,是所有应用程序窗口的基础。
1.2 Application Windows:用户和应用程序交互的接口。每个图形界面程序启动时,至少创建一个主窗口。Application Windows又分为客户区和非客户区。
1.2.1 非客户区由系统管理,包括title bar, menu bar, window menu, minimize and maximize buttons, sizing border, and scroll bars,
1.2.2 客户区由应用程序管理,用于显示图形和文字信息。
1.3 Controls: 一种子窗口(Child Windows),一般联合其它类型的Window完成简单的输入输出任务。一般用于Dialog Box,但也能和其它window类型配合。常用的Controls有:Button, Edit, Static, Combo Box等。
1.4 Dialog Boxes: 一种包含一个或多个Controls控件的Window,一般是临时窗口,用于接受用户信息。和Application Windows的主要区别在于,一般没有menu bar, minimize and maximize buttons和scroll bars.
Dialog有为两种,DialogBox() API创建一个modal dialog box,而CreateDialog()创建一个modeless dialog box。正常情况下,Dialog必须要有父窗口;虽然不指定父窗口也能运行,但由于跟程序的其它窗口没有派生关系,很容易引起问题。
2. 创建window
2.1 注册window class (RegisterClassEx() )。主要负责指明消息处理函数,窗体风格等
2.1.1 window class类型。分为系统,全局以及局部类型。Windows查找一个window class时,优先在局部列表里找,其次在全局列表里找,最后才在系统列表里找。
2.1.1.1 系统类型(System Classes)是指系统已经注册好了的window class,任何应用程序可以直接拿来使用, 如Button, ComboBox 和 Edit等。
2.1.1.2 全局类型(Application Global Classes)是指在一个process范围内所有模块都可以使用 的window class
2.1.1.3 局部类型(Application Local Classes)是指模块自己内部使用的window class
2.2 创建window (CreateWindowEx() )。使用window class 创建window, 指明一些附加属性,如边框类型等。
2.3 如果需要动态改变一个window instance的属性,调用SetWindowLong()来设置各项属性,甚至可以改变该window的消息处理函数,这称为subclassing.
2.4 处理消息循环
2.5 销毁window (DestroyWindow() ).
3. Window类型
在调用 CreateWindowEx()函数时给dwStyle设置合适的值
3.1 Overlapped Windows: 一种 "top-level"的窗口, 通常用作应用程序的主窗口。
基本风格: title bar, border, and client area (WS_OVERLAPPED)
可选风格: window menu, minimize and maximize buttons, and scroll bars(WS_OVERLAPPEDWINDOW)
3.2 Pop-up Windows: 一种特殊类型的“Overlapped Windows”,常用于"dialog boxes", " message boxes"以及其它临时窗口,这种窗口的特点是可以在主窗口区域之外显示。
基本风格: border and client area(WS_POPUP)
可选风格2: Title bars(WS_CAPTION), 这种情况下,和带(WS_OVERLAPPED)标志的"Overlapped Windows"完全一样。
可选风格2: border and window menu(WS_POPUPWINDOW),必须和(WS_CAPTION)合并使用.
3.3 Child Windows: 受限于父窗口的客户区(client area)的一种窗口,一般用于把父窗口的客服区划分为几个子功能区。Child Windows的父窗口可以是一个overlapped window, 一个pop-up
window, 或另外一个child window。Child Window必须有父窗口。
基本风格:不带任何窗口元素(WS_CHILD)
可选风格: 合并title bar(WS_CAPTION), minimize and maximize buttons(WS_MINIMIZEBOX and WS_MAXIMIZEBOX) , border(WS_BORDER), and scroll bars(WS_HSCROLL or WS_VSCROLL)
子窗口的几个重要属性:
3.3.1 子窗口的坐标原点是父窗口的左上角位置,且子窗口超出父窗口客户区的部分不会被显示
3.3.2 父窗口的Hidden, Shown,Move 和 Destroy事件会自动影响子窗口。例如,在父窗口Destory之前,所有的子窗口会被自动Destory
3.3.3 父窗口交出一部分客户区给子窗口,在这些区域上发生的消息事件,系统绕过父窗口直接发送给子窗口。唯一的例外是子窗口被disable了,这时所有子窗口的消息被发给父窗口。
3.3.4 子窗口可以有一个用户定义的唯一ID。这在使用control windows时特别有用,程序通过ID和control windows的子窗口进行消息交互。
3.4 其它特色窗口类型
3.4.1 Layered Windows: 一种主窗口,由系统自动管理窗口之间的叠层关系,减少重绘次数,提高性能。
3.4.2 Message-Only Windows: 一种不可见的窗口,只用于消息循环。
4. Windows的主从关系(Owned window and Owner window)
主从关系(Owner/Owener)和派生关系(Parent/Child)有些相似,但是两种不同的关系。
4.1 只有Overlapped Window或Pop-up Window能当主窗口(Owner window),Child Windows不行。窗口的主从关系是在调用CreateWindowEx()时通过hwndParent参数指定的。如果父窗口也是个Child Windows,则窗口的所有权被指定为该父窗口的主窗口(Owner window).
4.2 有主从关系的windows有下列一些约束:
4.2.1 在Z-order关系上,从窗口(owned window)永远在主窗口(owner window)之上
4.2.2 当主窗口销毁时,从窗口自动销毁
4.2.3 当主窗口最小化时,从窗口自动隐藏
Friday, September 17, 2010
GTP(GPRS Tunnelling Protocol) 协议
1. GTP v1 for user plan. 3GPP TS 29.281. used in:
LTE-S1 (between eNodeB and SGW), control plan is S1AP
LTE-S5 (between SGW and PGW), control plan is GTPv2-C
LTE-X2 (between eNodeBs), control plan is X2AP
2. GTPv2-C for control plan. 3GPP TS 29.274. used in:
LTE-S5
LTE-S8
3. GTP (GTP-C and GTP-U) 3GPP TS 29.060. used in
Gn (between GSNs within a PLMN)
Gp (between GSNs in different PLMNs)
Iu (between SGSN and UTRAN), GTP-U only. The control plan is RANAP
4. GTP based charging protocol GTP'. 3GPP TS 32.295
LTE-S1 (between eNodeB and SGW), control plan is S1AP
LTE-S5 (between SGW and PGW), control plan is GTPv2-C
LTE-X2 (between eNodeBs), control plan is X2AP
2. GTPv2-C for control plan. 3GPP TS 29.274. used in:
LTE-S5
LTE-S8
3. GTP (GTP-C and GTP-U) 3GPP TS 29.060. used in
Gn (between GSNs within a PLMN)
Gp (between GSNs in different PLMNs)
Iu (between SGSN and UTRAN), GTP-U only. The control plan is RANAP
4. GTP based charging protocol GTP'. 3GPP TS 32.295
Friday, August 20, 2010
boost::MPL - basic tools
1. lambda表达式:一种元数据(metadata)。有两种表达方式,一是普通的元数据类,二是占位符表达式(placeholder expressions)。占位符表达式的本质是把第n个元数据封装成一个元数据类。
如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:
struct arg<1>
{
template <class A1, class A2 > ;
struct apply
{
typedef A1 type; // return first argument
}
};
整个语句的含义相当于:
struct Temp
{
template<typename Arg1, typename Arg2>
struct apply {
typedef mpl::plus<Arg1, Arg2> type;
};
}
2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。
3.有价值的概念
3.1 compile time to runtime mapping,
用途: 从mataprogramming 转到
工具:mpl::for_each<>, boost::fusion
3.2 runtime to compile time mapping。
用途:提供缓式计算,避免不必要的运行时开销,提高性能
工具:参照blitz++
3.3 闭包
3.4 命名参数
用途:函数接受大量参数时,简化参数传递
工具:
如"mpl::plus<_1, _2>",其中的"_1"大致相当于下边的定义:
struct arg<1>
{
template <class A1, class A2 >
struct apply
{
typedef A1 type; // return first argument
}
};
整个语句的含义相当于:
struct Temp
{
template<typename Arg1, typename Arg2>
struct apply {
typedef mpl::plus<Arg1, Arg2> type;
};
}
2. mpl::vector, mpl::list, etc. 与std::vector, std::list有类似语义的元数据。但是,std容器中装的是变量,mpl容器中装的是类型。即:mpl可以对mpl容器中的类型进行运算,得到新的类型。
3.有价值的概念
3.1 compile time to runtime mapping,
用途: 从mataprogramming 转到
工具:mpl::for_each<>, boost::fusion
3.2 runtime to compile time mapping。
用途:提供缓式计算,避免不必要的运行时开销,提高性能
工具:参照blitz++
3.3 闭包
3.4 命名参数
用途:函数接受大量参数时,简化参数传递
工具:
boost::MPL - Conceptions
1. MPL 的几个重要概念。
1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:
template <int base, int power>
struct Power
{
static const int value = base * Power ::value;
};
template <int base>
struct Power <base, 0>
{
static const int value = 1;
};
int _3power5 = Power<3, 5>::value;
1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。
元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。
template <bool condition, class L, class R >
struct Selector
{
typedef L type;
};
template <class L, class R >
struct Selector <false, L, R >
{
typedef R type;
};
Selector<true, int, float>::type _int = 10; // int
Selector<false, int, float>::type _float = 1.23; // float
1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).
struct SelectorWrapper
{
template<bool condition, class L, class R>
struct apply
{
typedef typename Selector<condition, L, R>::type type;
};
};
SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int
1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。
1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform
template<class F, class X>
struct high_order_fun
{
typedef typename F::template apply::type type;
};
1.1 元数据(Metadata): 可以被C++编译器在编译期操纵的"值",主要有两种:类型和常量(int, bool, global ptr, etc)。由于元数据是不可变的(immutable),元编程(Metaprogramming)中的迭代一般是通过递归来完成的。如:
template
{
static const int value = base * Power
};
template
static const int value = 1;
};
int _3power5 = Power<3, 5>::value;
1.2 元函数(Metafunction):一个可以在编译期"调用"的"函数",输入参数是metadata(也可以没有任何输入参数),输出参数是一个名为"type"的类型。对于数值型metafunction,还有输出一个名为"value"的常量。
元函数与传统的traits很相似,但在概念上有很大区别。traits是把很多特性集合在一起,运用程序在这个集合中各取所需。元函数则完全模仿了"函数(function)"这个概念,具有很强的可扩展性。
template
struct Selector
{
typedef L type;
};
template
struct Selector
{
typedef R type;
};
Selector<true, int, float>::type _int = 10; // int
Selector<false, int, float>::type _float = 1.23; // float
1.3 元函数类(Metafunction class)(??有更好的不容易与元函数混淆的翻译??): 一个实现了元函数"apply"的类。概念上类似于c++中的仿函数(functor).
struct SelectorWrapper
{
template<bool condition, class L, class R>
struct apply
{
typedef typename Selector<condition, L, R>::type type;
};
};
SelectorWrapper::apply<true, int, float>::type _int1 = 20; // still int
1.4 多态(Polymorphism):同一接口具有操作不同类型的能力。MPL通过返回"type"和"value"的约定,确保代码的可复用性和组件之间互操作的自然性。
1.5 高阶元函数(high-order metafunction):一种元函数,接受并且在运算中使用其它元函数参数。概念上类似于接受函数指针的函数,或接受functor的函数。典型的高阶元函数是 boost::mpl::transform
template<class F, class X>
struct high_order_fun
{
typedef typename F::template apply
};
Subscribe to:
Posts (Atom)