我自闲庭信步,悠然自得,不亦乐乎.

                                       ------ Keep life simple
GMail/GTalk/MSN:huyi.zg@gmail.com

 

取自ACE中的bit操作宏

# define ACE_BIT_ENABLED(WORD, BIT) (((WORD)  &  (BIT))  !=   0 )
# define ACE_BIT_DISABLED(WORD, BIT) (((WORD) 
&  (BIT))  ==   0 )
# define ACE_BIT_CMP_MASK(WORD, BIT, MASK) (((WORD) 
&  (BIT))  ==  MASK)
# define ACE_SET_BITS(WORD, BITS) (WORD 
|=  (BITS))
# define ACE_CLR_BITS(WORD, BITS) (WORD 
&=   ~ (BITS))

附上C中常用的位运算用法,取自《C Primer Plus》

掩码:即mask,通常为某一个位为1,而其他位都为0的byte,如00000100。

1.把byte中除掩码相同的位外,全部置0,掩码位不变
flags &= mask
   10101111 & 00000100 = 00000100

2.打开位:打开特定的位,其他位不变。
flags |= MASK
00001000 | 00000100 = 00001100

3.关闭位:关闭特定位,但不影响其他位
flags &= ~MASK
11100101 &=  ~10000000 = 01100101

4.转置位:一个位如果打开,则关闭;如果关闭,则打开
flags ^= MASK
11100101 ^=  10000000 = 01100101
11100101 ^=  00010000 = 11110101

5.查看一个位的值:
if ((flag & MASK) == MASK)
    do_some_work();

 

posted @ 2006-04-03 10:08 HuYi 阅读(626) | 评论 (0)编辑 收藏

TIM中网络模型变更

一直都隐隐约约的感觉TIM的网络模型还是有点问题,但却总说不出具体问题来。时不时就会想起这个事,今天在车上,终于恍然大悟。
也许是受wildfire和jabberd2的影响太深了(特别是wildfire),TIM中网络和业务处理的联系过于紧密,从套接口读到数据流后,马上就进入XML的PullParser分析阶段,虽然之后有刻意的分离网络操作和业务逻辑,但并不彻底。
有时候业务处理还是能够感觉到网络的存在,我觉得这是个不良的设计。
让我耿耿于怀的,是Reactor的单线程特性。或许在某些情况下这是它的优势,但运用不当,就会成劣势。现在的TIM把业务逻辑和网络IO都挤进了Reactor所控制的线程中,只要存在一点点的阻塞,吞吐率将大打折扣。
wildfire敢把网络和业务绑得那么紧,是因为它采用的per-request,per-thread的模型,网络IO引起的阻塞不会影响到其他request处理。我也没有wildfire那么大的胆子采用per-request,per-thread,上下文切换的消耗不说,毕竟线程的数量也是有限制的,我很怀疑到底能承受多少连接数,如果没有记错,Linux没有重编译内核,一个进程内最多是1024个线程,Windows能多些,好像是65535,数据可能不准确,但也说明了线程资源是有限的。同时,WFMOReactor在Windows下每个线程内可同时监视的句柄数(62个),也似乎太少了,这点也让我烦恼。
仔细推敲后,我认为还是把网络和业务完全脱离比较好一点,用至少一个线程专门操作套接口,突破WaitForMultipleObjects的句柄数限制,再用另外一个线程来完成业务。在业务线程上使用管道过滤器模式来一步一步的处理数据。当Reactor线程接收到数据后,放进MessageBlock里面,用Task框架来处理。
这种模型确实解决了原先的诸多毛病,但如果在这个时候改网络模型,对整个项目是个不小的冲击,极有可能导致在计划的时间内不能完成项目。犹豫了一下,为了保证品质,最终还是在SubVersion上创建了新的试验分支。
module.jpg

posted @ 2006-03-27 22:54 HuYi 阅读(479) | 评论 (0)编辑 收藏

[2006.03.26]噩耗传来

2006,狗年,我24,本命年。
2006,狗年,小姨36,也是本命年。
早上醒来,接到母亲的电话,告诉我小姨爹癌症扩散,就快去世了。虽然一直知道小姨爹的病,但没想到会这么严重。
小姨妈两口,最疼爱我的人,我走到今天,他们是给我帮助最大的人,我的恩人。
我妈以前是三班倒,几个姨妈在还是孩子的时候,就开始帮我妈带孩子,对我是疼爱有加,特别是小姨妈,结婚后一直无子,也没有领养,一直把我当亲儿看待。
前两天父亲打电话来,叫我有空多打打电话给小姨爹的时候,我就开始怀疑,但父亲却不告诉我真实情况。
今天早上接到母亲电话,真的很伤心,我也无法用言语来表达,当时甚至没有哭出来,已经木了,过了十几分钟才泪上眼眶。
平静下来,给姨爹通了电话,他还不知道自己的病情,但听得出来确实虚弱了很多。偏偏电话信号又不好,没说几句就断了。
在这里祝福姨爹,一定会有好转的!!!

posted @ 2006-03-26 23:14 HuYi 阅读(323) | 评论 (2)编辑 收藏

今天逛了趟书店,买了几本书^^

本来是陪朋友去买《UNIX编程艺术》,不过着实看见几本很不错的书,也买了几本^^
1。《Linux内核完全剖析》
看过作者的另一本书《Linux1.1源码完全注释》,觉得不错,国内有这个水平的人可能不少,但能做到这么细致的人就不多了。
大概翻了一下,决定买下了。
2。《Linux Application Development》(linux应用程序开发第二版)
这类书籍看过不少了,本不应再买,但随手翻了一页,看到了epoll,这是Linux2.6之后才加入的新特性,看来书挺新的,应该是近年才编写的,又看了一下目录,对Linux下的绝大多数编程任务都有描述,买一本做手册吧。
3。《精通UNIX Shell脚本编程》
开发UNIX/Linux程序也很久了,但确实没有认真学过脚本,也不想像C/C++一样学脚本,正好看见这本书,都是平时经常用的脚本例子,大多数情况下用这里的例子稍微改改就能满足需要了:)
4。《GCC技术参考大全》
这书可买可不买,GCC网站上就有很详细的说明,当手册用吧。
5。《我的编程感悟》
快离开书店时忽然看见的,闻此书大名很久了,也一直在作者“云风”的邮件列表里,对大侠的佩服犹如滔滔江水连绵不绝呀,也许在这本书中,能找到云大侠的过去,也作为对云大侠的支持,买了一本。回家的车上看了一些,觉得很不错,向大家推荐。

posted @ 2006-03-25 15:38 HuYi 阅读(419) | 评论 (0)编辑 收藏

给大家共享一个基本算法包

下载地址   
http://www.cppblog.com/Files/huyi/datastruct.rar


包含内容:
下面是文档包含的内容:
二分查找1.c
二分查找2.c
二叉树.c
其它

单元加
单循环链表.c
单链表.c
图.c
字符
定长串.c

小写数字转为大写数字
带头结点双链循环线性表.c
底层编程
效验算法
数学问题
数据结构
数组
文件程序
求进制
汉诺塔
硬币情况
逆阵
链串.c
链栈.c
链队列.c
问题算法
顺序栈.c
顺序表.c
顺序队列.c

./其它:
c语言窗体实例.zip
傻瓜递归.c
冒泡法改进.c
小字库DIY-.c
小字库DIY.c
小白鼠钻迷宫.c
扫描码.C
挽救软盘.c
汉字字模.c
神经元模型.c
穷举搜索法.c
简单数据库.c
编程汉字问题.txt
编随机数.c
试题.C
递堆法.C

./单元加:
erre2.c
erre.c
数组完全单元.c
栈单元加.c

./字符:
单词倒转.c
反出字符.c
回文.c
字符串查找.c
字符编辑.c
字符编辑技术(插入和删除) .c

./小写数字转为大写数字:
小写数字转换成大写数字1.c
小写数字转换成大写数字2.c
小写数字转换成大写数字3.c

./底层编程:
asm.c
C标志符命名源程序.c
ping.c
winsock2.c
时间陷阱.c
检出错误.c
检测鼠标.c

./效验算法:
C.BAT
CMCRC.COM
Crctable.c

./数学问题:
乘法矩阵.c
凉东问题
十五人排序.c
叠代整除.c
四分砝码.c
圆周率
多位阶乘2.c
多位阶乘.c
大加数.c
大小倍约.c
大整数.c
完数.c
小孩分糖果.c
小明买书
平方根.c
数学算法
桃子猴问题
灯塔问题.c
百鸡百钱.c
简单计算器.c
苹果纠纷
递推.c
逻辑移动.c
阶乘递归.c
阿姆斯特朗数.c
黑白.c

./数学问题/凉东问题:
32.c
re.c
数组递归退出2.c
数组递归退出.c

./数学问题/圆周率:
圆周率.c
狐狸圆周率.cpp

./数学问题/小明买书:
小明买书.c
小明买书.cpp

./数学问题/数学算法:
余弦曲线.c
余弦直线.c
符号图形.c
绘制圆.c

./数学问题/桃子猴问题:
_notes
乘方函数桃子猴.c
桃子猴.c
猴子和桃.c
递归桃猴.c
题目.txt

./数学问题/桃子猴问题/_notes:

./数学问题/苹果纠纷:
ff.c
苹果分法.c

./数据结构:
二叉排序树.c
二叉树实例.c
单链表
双链表正排序.c
各种排序法.c
哈夫曼算法.c
哈慢树.c
大整数.c
建树和遍历.c
排序法.c
推箱子.c
数据结构2.c
数据结构3.c
数据结构.c
无向图.c
栈操作.c
线性顺序存储结构.c
线索化二叉树.c
迷宫.c
迷宫问题.c
逆波兰计算器.c
递归车厢.c
队列.c

./数据结构/单链表:
ww.c
冒泡排序.c
单链表1.c
单链表2.c
单链表.c
单链表倒序.c
单链表的处理全集.c
建立链表1.c
节点.c
质因子.c
链表十五人排序.c
链表(递归).c

./数组:
数字移动.c
数组操作.c
杨辉三角形.c
桶排序.c
矩阵转换.c
螺旋数组1.c
螺旋数组2.c

./文件程序:
实例1.c
实例2.c
实例3.c
文件加密.c
文件复制.c
文件连接.c
自我复制.c
读写文本文件.c
输出自已.c

./求进制:
16进制10进制.c
二进制数2.c
二进制数.c

./汉诺塔:
四塔1.c
四塔2.c
换位递归.c
汉诺塔2.c
汉诺塔.c
诺汉塔画图版.c
非递归.c

./硬币情况:
for循环的.c
硬币分法.c

./逆阵:
简单逆阵.c
逆矩阵.c
逆阵.c

./问题算法:
N皇后问题回溯算法.c
万年历
动态计算网络最长最短路线.c
矩阵乘法动态规划.c
网络最短路径Dijkstra算法.c
货郎担分枝限界图形演示.c
货郎担限界算法.c
骑士遍历

./问题算法/万年历:
万年历.c
万年历的算法 .c

./问题算法/骑士遍历:
骑士遍历1.c
骑士遍历2.c
骑士遍历回逆.c

posted @ 2006-03-23 08:51 HuYi 阅读(1944) | 评论 (4)编辑 收藏

今天买了一个共享软件:CyberArticle

在您上网的时候, 您一定会遇到很到好文章,怎么保存?用IE的保存功能?过不了多久,您就会忘记,保存在那里了。使用CyberArticle保存网页,过程非常简单,通过鼠标右键,您就可以快速的将文章保存起来。还有,您可能更希望将好看的Flash动画保存下来,这次,连IE也无能为力了。怎么办?使用CyberArticle,您可以将这些内容完整无缺的保存下来。
http://www.wizissoft.com/cn/

其实我用这个软件很久了,真的很方便。不过我一直用的破解版:b
今天上它主页看了看,注册费用挺公道的,25元,可以接受,作为对作者的支持,用信用卡在网上买了一份,几分钟注册码就发到了。

向需要类似软件的朋友推荐。

posted @ 2006-03-22 15:18 HuYi 阅读(367) | 评论 (0)编辑 收藏

推荐一个sniffer - ethereal

今天同事推荐给我的,确实比较好用,有对应多个平台的版本,而且是免费的。
之前一直用的WPE,那玩意儿虽然也不错,但老是被诺顿认为是病毒,用ethereal就没有这个问题了,功能也更强大。用来进行少量信息收集挺不错的。如果要7*24的收集大量信息,还是tcpdump吧。

附上网址:
http://www.ethereal.com/

posted @ 2006-03-21 14:07 HuYi 阅读(333) | 评论 (0)编辑 收藏

web服务器的架构设计

又有感兴趣的话题了:
liu chuncheng:
前两天看了一篇有关IOCP的文章,里面提到apache。文章作者的观点是用IOCP模型的IIS应该比进程模型的apache的性能要高。我想针对这个主题发起讨论。
首先说一下我的观点:
1、IOCP是windows下比较高效的一个异步IO模型,他可以克服I/O设备慢速的缺点,从而可以构建一个高效的网络通讯模型。
2、但我认为IOCP也不是万能的,只有合适的应用才会发挥他的长处。比如游戏服务器,或者流媒体服务器等。
3、但我认为对于web服务器它不是最好的方案,原因如下:
    a、web服务器的连接之间的数据是独立的,没有联系的,那么每个连接的数据用一个线程或者进程来处理是很高效的,处理完之后就退出了,再没有任何其它的
开销。如果用IOCP那么就要放到队列里,从线程池里面频繁的切换线程来处理数据,这种开销还是比较大的。只是web的资源需要做同步的机制。

b、web服务器是基于短连接的,区别于游戏服务器的长连接,就是不需要对这个连接做更多的管理。相当于一个连接上来之后就做一个任务,做完任务之后就一拍两散
    综合上面的两点,化繁为简,我认为对于web服务器用最简单的网络模型——1连接+1线程,可能也是比较好的方案。

    一家之言,欢迎大家拍砖!
http://groups.google.com/group/dev4server/browse_thread/thread/6cd19a9afc1fd295/4624a8b4bf162e6f#4624a8b4bf162e6f

posted @ 2006-03-20 15:07 HuYi 阅读(560) | 评论 (0)编辑 收藏

GCC参数祥解

[介绍]
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp]
2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
4.连接目标代码,生成可执行程序[链接器ld]
[参数详解]
-x language filename
  设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后
缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很个性,决定你的C代码文件的后缀
名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了
下一个参数的使用。
  可以使用的参数吗有下面的这些
  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
  看到英文,应该可以理解的。
  例子用法:
  gcc -x c hello.pig
  
-x none filename
  关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
  例子用法:
  gcc -x c hello.pig -x none hello2.c
  
-c
  只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
  例子用法:
  gcc -c hello.c
  他将生成.o的obj文件
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
  gcc -S hello.c
  他将生成.s的汇编代码,你可以用文本编辑器察看
-E
  只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
  例子用法:
  gcc -E hello.c > pianoapan.txt
  gcc -E hello.c | more
  慢慢看吧,一个hello word 也要与处理成800行的代码
-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感
,改掉它,哈哈
  例子用法
  gcc -o hello.exe hello.c (哦,windows用习惯了)
  gcc -o hello.asm -S hello.c
-pipe
  使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
  gcc -pipe -o hello.exe hello.c
-ansi
  关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inl
ine typeof关键字,以及UNIX,vax等预处理宏,
-fno-asm
  此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
    
-fno-strict-prototype
  只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数
的个数和类型说明,而不是没有参数.
  而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型

  
-fthis-is-varialble
  就是向传统c++看齐,可以使用this当一般变量使用.
  
-fcond-mismatch
  允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
  
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
  这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参
数)或者 signed char(后两个参数)
  
-include file
  包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设
定,功能就相当于在代码中使用#include<filename>
  例子用法:
  gcc hello.c -include /root/pianopan.h
  
-imacros file
  将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
  
-Dmacro
  相当于C语言中的#define macro
  
-Dmacro=defn
  相当于C语言中的#define macro=defn
  
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对任何非标准宏的定义
  
-Idir
  在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
  回先在你所制定的目录查找,然后再按常规的顺序去找.
  对于#include<file>,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺
省的头文件目录查找
  
-I-
  就是取消前一个参数的功能,所以一般在-Idir之后使用
  
-idirafter dir
  在-I的目录里面查找失败,讲到这个目录里面查找.
  
-iprefix prefix
-iwithprefix dir
  一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
  
-nostdinc
  使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头
文件的位置
  
-nostdin C++
  规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创libg++库
使用
  
-C
  在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的

  
-M
  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c
来测试一下,很简单。
  
-MM
  和上面的那个一样,但是它将忽略由#include<file>造成的依赖关系。
  
-MD
  和-M相同,但是输出将导入到.d的文件里面
  
-MMD
  和-MM相同,但是输出将导入到.d的文件里面
  
-Wa,option
  此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然
后传递给会汇编程序
  
-Wl.option
  此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然
后传递给会连接程序.
  
-llibrary
  制定编译的时候使用的库
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程序
  
-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。
  
-O0
-O1
-O2
-O3
  编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 
    
-g
  只是编译器,在编译的时候,产生调试信息。
  
-gstabs
  此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
  
-gstabs+
  此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
  
-ggdb
  此选项将尽可能的生成gdb的可以使用的调试信息.
-static
  此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么
动态连接库,就可以运行.
-share
  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-traditional
  试图让编译器支持传统的C语言特性
[参考资料]
-Linux/UNIX高级编程
  中科红旗软件技术有限公司编著.清华大学出版社出版
-Gcc man page
  
[ChangeLog]
-2002-08-10
  ver 0.1 发布最初的文档
-2002-08-11
  ver 0.11 修改文档格式
-2002-08-12
  ver 0.12 加入了对静态库,动态库的参数
-2002-08-16
  ver 0.16 增加了gcc编译的4个阶段的命令
运行 gcc/egcs
**********运行 gcc/egcs***********************
  GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 O
bject C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++
源程序。
  如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可
执行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编
译生成一个计算阶乘的程序。
代码:
-----------------------
清单 factorial.c
-----------------------
int factorial (int n)
{
  if (n <= 1)
   return 1;
  else
   return factorial (n - 1) * n;
}
-----------------------
清单 main.c
-----------------------
#include <stdio.h>
#include <unistd.h>
int factorial (int n);
int main (int argc, char **argv)
{
  int n;
  if (argc < 2)
  {
    printf ("Usage: %s n\n", argv [0]);
    return -1;
  }
  else
  {
   n = atoi (argv[1]);
   printf ("Factorial of %d is %d.\n", n, factorial (n));
   }
  return 0;
}
-----------------------
利用如下的命令可编译生成可执行文件,并执行程序:
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.
  GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀
名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源
文件的后缀名为 .C 或 .cpp。但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C
++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程
序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件(hello.C):
#include <iostream>
void main (void)
{
  cout << "Hello, world!" << endl;
}
则可以如下调用 g++ 命令编译、连接并生成可执行文件:
$ g++ -o hello hello.C
$ ./hello
Hello, world!
**********************gcc/egcs 的主要选项*********
gcc 命令的常用选项
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

posted @ 2006-03-20 10:30 HuYi 阅读(513) | 评论 (1)编辑 收藏

cyrus_sasl API使用方法

/*  This is a proposed C API for support of SASL
 *
 *********************************IMPORTANT*******************************
 * send email to chris.newman@innosoft.com and cyrus-bugs@andrew.cmu.edu *
 * if you need to add new error codes, callback types, property values,  *
 * etc.   It is important to keep the multiple implementations of this   *
 * API from diverging.                                                   *
 *********************************IMPORTANT*******************************
 *
 * Basic Type Summary:
 *  sasl_conn_t       Context for a SASL connection negotiation
 *  sasl_ssf_t        Security layer Strength Factor
 *  sasl_callback_t   A typed client/server callback function and context
 *  sasl_interact_t   A client interaction descriptor
 *  sasl_secret_t     A client password
 *  sasl_rand_t       Random data context structure
 *  sasl_security_properties_t  An application's required security level
 *
 * Callbacks:
 *  sasl_getopt_t     client/server: Get an option value
 *  sasl_logmsg_t     client/server: Log message handler
 *  sasl_getsimple_t  client: Get user/language list
 *  sasl_getsecret_t  client: Get authentication secret
 *  sasl_chalprompt_t client: Display challenge and prompt for response
 *
 * Server only Callbacks:
 *  sasl_authorize_t             user authorization policy callback
 *  sasl_server_userdb_checkpass check password and auxprops in userdb
 *  sasl_server_userdb_setpass   set password in userdb
 *  sasl_server_canon_user       canonicalize username routine
 *
 * Client/Server Function Summary:
 *  sasl_done         Release all SASL global state
 *  sasl_dispose      Connection done: Dispose of sasl_conn_t
 *  sasl_getprop      Get property (e.g., user name, security layer info)
 *  sasl_setprop      Set property (e.g., external ssf)
 *  sasl_errdetail    Generate string from last error on connection
 *  sasl_errstring    Translate sasl error code to a string
 *  sasl_encode       Encode data to send using security layer
 *  sasl_decode       Decode data received using security layer
 *  
 * Utility functions:
 *  sasl_encode64     Encode data to send using MIME base64 encoding
 *  sasl_decode64     Decode data received using MIME base64 encoding
 *  sasl_erasebuffer  Erase a buffer
 *
 * Client Function Summary:
 *  sasl_client_init  Load and initialize client plug-ins (call once)
 *  sasl_client_new   Initialize client connection context: sasl_conn_t
 *  sasl_client_start Select mechanism for connection
 *  sasl_client_step  Perform one authentication step
 *
 * Server Function Summary
 *  sasl_server_init  Load and initialize server plug-ins (call once)
 *  sasl_server_new   Initialize server connection context: sasl_conn_t
 *  sasl_listmech     Create list of available mechanisms
 *  sasl_server_start Begin an authentication exchange
 *  sasl_server_step  Perform one authentication exchange step
 *  sasl_checkpass    Check a plaintext passphrase
 *  sasl_checkapop    Check an APOP challenge/response (uses pseudo "APOP"
 *                    mechanism similar to CRAM-MD5 mechanism; optional)
 *  sasl_user_exists  Check if user exists
 *  sasl_setpass      Change a password or add a user entry
 *  sasl_auxprop_request  Request auxiliary properties
 *  sasl_auxprop_getctx   Get auxiliary property context for connection
 *  sasl_auxprop_store    Store a set of auxiliary properties
 *
 * Basic client model:
 *  1. client calls sasl_client_init() at startup to load plug-ins
 *  2. when connection formed, call sasl_client_new()
 *  3. once list of supported mechanisms received from server, client
 *     calls sasl_client_start().  goto 4a
 *  4. client calls sasl_client_step()
 * [4a. If SASL_INTERACT, fill in prompts and goto 4
 *      -- doesn't happen if callbacks provided]
 *  4b. If SASL error, goto 7 or 3
 *  4c. If SASL_OK, continue or goto 6 if last server response was success
 *  5. send message to server, wait for response
 *  5a. On data or success with server response, goto 4
 *  5b. On failure goto 7 or 3
 *  5c. On success with no server response continue
 *  6. continue with application protocol until connection closes
 *     call sasl_getprop/sasl_encode/sasl_decode() if using security layer
 *  7. call sasl_dispose(), may return to step 2
 *  8. call sasl_done() when program terminates
 *
 * Basic Server model:
 *  1. call sasl_server_init() at startup to load plug-ins
 *  2. On connection, call sasl_server_new()
 *  3. call sasl_listmech() and send list to client]
 *  4. after client AUTH command, call sasl_server_start(), goto 5a
 *  5. call sasl_server_step()
 *  5a. If SASL_CONTINUE, output to client, wait response, repeat 5
 *  5b. If SASL error, then goto 7
 *  5c. If SASL_OK, move on
 *  6. continue with application protocol until connection closes
 *     call sasl_getprop to get username
 *     call sasl_getprop/sasl_encode/sasl_decode() if using security layer
 *  7. call sasl_dispose(), may return to step 2
 *  8. call sasl_done() when program terminates
 *
 *************************************************
从sasl.h中截取的。

posted @ 2006-03-19 11:21 HuYi 阅读(658) | 评论 (0)编辑 收藏

仅列出标题
共7页: 1 2 3 4 5 6 7 

导航

统计

常用链接

留言簿(12)

随笔分类

相册

收藏夹

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜