2005年05月16日

From  :http://www.yesky.com/SoftChannel/72342393369657344/20050319/1924087.shtml
Author:钟华
Date   :2005-03-21

  摘要 随着测试走向规范化管理,测试计划成为测试经理必须完成的重要任务之一,本文根据实践经验结合理论,探讨如何制定软件项目测试计划。

  关键字 测试计划 变更

  正文

  软件测试计划作为软件项目计划的子计划,在项目启动初期是必须规划的。在越来越多公司的软件开发中,软件质量日益受到重视,测试过程也从一个相对独立的步骤越来越紧密嵌套在软件整个生命周期中,这样,如何规划整个项目周期的测试工作;如何将测试工作上升到测试管理的高度都依赖于测试计划的制定。测试计划因此也成为测试工作的赖于展开的基础。

  一个好的测试计划可以起到如下作用

  1. 避免测试的“事件驱动”

  2. 使测试工作和整个开发工作融合起来

  3. 资源和变更事先作为一个可控制的风险

  测试计划的模板在各个公司中都大同小异,在个人实践中发现,测试计划制定中存在的问题具有相似性,下面重点就这些相似的问题谈谈如何制定软件项目测试计划。

  问题一:测试阶段划分

  就通常软件项目而言,基本上采用“瀑布型”开发方式,这种开发方式下,各个项目主要活动比较清晰,易于操作。整个项目生命周期为“需求-设计-编码-测试-发布-实施-维护”。然而,在制定测试计划时候,有些测试经理对测试的阶段划分还不是十分明晰,经常性遇到的问题是把测试单纯理解成系统测试,或者把把各类型测试设计(测试用例的编写和测试数据准备)全部放入生命周期的“测试阶段”,这样造成的问题是浪费了开发阶段可以并行的项目日程,另一方面造成测试不足。

  合理的测试阶段应遵循下面划分方法:



  照上图所述,相应阶段可以同步进行相应的测试计划编制,而测试设计也可以结合在开发过程中实现并行,测试的实施即执行测试的活动即可连贯在开发之后。值得注意的是:单元测试和集成测试往往由开发人员承担,因此这部分的阶段划分可能会安排在开发计划而不是测试计划中。

  问题二:系统测试阶段日程安排

  划分阶段清楚了,随之而来的问题是测试执行需要多长的时间?标准的工程方法或CMM方式是对工作量进行估算,然后得出具体的估算值。但是这种方法过于复杂,可以另辟专题讨论。一个可操作的简单方法是:根据测试执行上一阶段的活动时间进行换算,换算方法是与上一阶段活动时间1:1。1~1。5左右。举个例子,对测试经理来说,因为开发计划可能包含了单元测试和集成测试,系统测试的时间大概是编码阶段(包含单元测试和集成测试)1到1。5倍。这种方法的优点是简单,依赖于项目计划的日程安排,缺点是水分太多,难于量化。那么,可以采用的另一个简单方法是经验评估。评估方法如下:

  1. 计算需求文档的页数,得出系统测试用例的页数

  需求页数:系统测试用例页数 ≈ 1:1

  2. 由系统测试用例页数计算编写系统测试用例时间

  编写系统测试用例时间 ≈ 系统测试用例页数×1小时

  3. 计算执行系统测试用例时间

  编写系统用例用时:执行系统测试用时 ≈ 1:2

  4. 计算回归测试包含的时间

  系统测试用时:回归测试用时≈ 2:1

  注:以上比值是个人工程经验值,需要更正比值的测试经理可以在具体实践中收集数据。

  基于以上方法优点是需求为已知的,可以利用已知来推算未知,适用于需求是已知且相对稳定的情况下;缺点是处于研发状态的项目,需求不清晰的时候比较难计算。现套用一个例子加于说明:需求文档页数为500,系统测试用例页数推算为500,则编写系统测试用例时间为500小时,执行系统测试用例时间为1000小时,回归测试需要500小时,加起来总共为2000小时,按一天8小时计算,共计250个工作日/人;假如一个月为22个工作日,则共计约11人/月,即投入4个人需要3个月左右时间工作量完成。当然,这是系统测试需要的全部时间。根据测试阶段划分原则,设计用例时间可以和开发同步进行,只需在测试阶段中安排的时间为1500小时即4人2个月工作量。

  (测试经理在编写测试计划时候,测试进度中的计划开始/结束时间往往用如20050101-20051201的具体时间划分方式,这样引起的问题是当项目计划进行变更的时候,测试计划时间不得不随时调整,这种变更可能是频繁而琐碎的,可以替代的办法是取消这种方式,采用30工作日/2人或者2人月这种工作量记录方式,这样一来,只需在项目计划中跟踪阶段的具体开始时间即可,不必反复修改测试计划。)

  值得注意的是:国内大多数公司的测试时间都是不足的,不可能按照这样的理想比例进行运作,因为测试执行的时间实际上不可能占据整个项目周期的1/2,甚至要短于其中任何一个项目阶段时间。即使是微软的测试结束原则也并不是完成所有必需的测试,而是测试在按计划结束的那一天结束!在测试时间不足的情况下,可参考下面项目计划变更时的做法,因为计划变更也涉及到测试时间不足的情况。

  问题三:变更的控制

  测试计划改变了已往根据任务进行测试的方式,因此,为使测试计划得到贯彻和落实,测试组人员必须及时跟踪软件开发的过程,对产品提交测试做准备,测试计划的目的,本身就是强调按规划的测试战略进行测试,淘汰以往以任务为主的临时性。在这种情况下,测试计划中强调对变更的控制显得尤为重要。

  变更来源于以下几个方面

  1. 项目计划的变更

  2. 需求的变更

  3. 测试产品版本的变更

  4. 测试资源的变更

  测试阶段的风险主要是对上述变更所造成的不确定性,有效的应对这些变更就能降低风险发生的几率。要想计划本身不成为空谈和空白无用的纸质文档,对不确定因素的预见和事先防范必须做到心中有数。

  对于项目计划的变更,除了测试人员及时跟进项目以外,项目经理必须认识到测试组也是项目成员,因此必须把这些变更信息及时通知到项目组,使得整个项目得到顺延。项目计划变更一般涉及都是日程变更,令人遗憾的是,往往为了进度的原因,交付期限是既定的,项目经理不得不减少测试的时间,这样,执行测试的时间就被压缩了。在这种情况下,测试经理常常固执的认为进度缩减的唯一的方法就是向上级通报并主观认为产品质量一定会下降,这种做法和想法不一定是正确的。由于时间不足,不能“完美”的执行所有测试,为了保证质量,第一种办法是调整测试计划中的测试策略和测试范围,实践中测试经理常常忽略测试计划的这个章节。调整的目的是重新检查不重要的测试部分,调换测试的次序和减少测试规模,对测试类型重新组合择优,力求在限定时间内做最重要部分的测试,可以把忽略部分留给确认测试或现场测试。其他应对办法包括减少进入测试的阻力,例如降低测试计划中系统测试准入准则;分步提交测试,例如改成迭代方式增量测试;减少回归测试的要求,例如开发人员实时修改,在测试计划中对缺陷修复响应时间和过程进行约定;和公司QA商量进行简化配置管理,跳过正式发布环节;缺陷进行局部回归而不是重新全部测试等等。

  第二:项目进行过程中最不可避免的就是需求的变更。那么,测试计划中就不能进行控制和约束的吗?答案是未必。当制定计划时,如果项目需求处于动态变化时,在测试用例章节就要进行说明。许多测试经理在编制测试用例时往往没有把测试用例和测试数据进行区分,因此,造成的问题是当需求变化时辛辛苦苦设计的数据就作废了。在这时,假使面临一个需求动态的项目,必须在计划中对需求变更造成的测试(设计)方式变化进行说明,例如采用用例和数据分离、流程和界面分离、字典项和数据元素分离的设计方式,然后等到最终需求确定后细化测试设计;另一个方面是最好制定一个变更周期的约定――尤其在执行测试阶段发现需求的变更――定义变更的最大频度和重新测试的界限,计划从一定程度上能够降低不可预期需求变化造成的投入损失。值得注意的是:需求发生变更时测试经理额外的工作是记住要在需求跟踪矩阵上做记录。

  对于测试产品版本的变更,除了部分是由于需求变更造成之外,很有可能是由于修改缺陷引发的问题或配置管理不严格造成。众所周知,测试必须是基于一个稳定的“基线”进行,否则,因反复修改造成测试资源和开发资源的浪费是可观的。合理的测试计划在章节中应增加一个测试更新管理的章节,在此章节明确更新周期和暂停测试的原则。例如,小版本的产品更新不能大于每天三次,一个相对大的版本不能每周大于1次,规定紧急发布产品仅限于何种类型的修改或变更,由谁负责统一维护和同步更新测试环境。测试计划通常制定了准入和准出准则,这是不够的,要考虑测试暂停的时候,产品错误发布或者服务器数据更新就是一个例子,暂停的时候如果测试经理不进行跟踪,可能发生测试组等待测试而没人通知继续测试的情况,所以,增加更新周期和暂停测试原则是很有必要的。

  最后,测试资源的变更是源自测试组内部的风险而非开发组风险,当测试资源不足或者冲突,测试部门不可能安排如此多的人手和足够时间参与测试时,在测试计划中的控制方法与测试时间不足相类似。没有测试经理愿意承担资源不足的测试工作,只能说公司本身是否具备以质量为主的体系或者项目经理对产品质量的重视程度如何决定了对测试资源投入的大小,最终产品质量取决因素不仅仅在于测试经理。为了排除这种风险,除了象时间不足、测试计划变更时那样缩减测试规模等等方法以外,测试经理必须在人力资源和测试环境一栏标出明确需要保证的资源,否则,必须将这个问题作为风险记录。规避风险的办法可能有:

  一,项目组的需求和实施人员参与系统测试;

  二,抽调不同模块开发者进行交叉系统测试或借用其他项目开发人员;

  三,组织客户方进行确认测试或发布β版本。

  尽管上面尽可能的描述了测试计划如何制定才能“完美”,但是还存在的问题是对测试计划的管理和监控。一份计划投入再多的时间去做也不能保证按照这份计划进行实施。好的测试计划是成功的一半,另一半是对测试计划的执行。对小项目而言,一份更易于操作的测试计划更为实用,对中型乃至大型项目来看,测试经理的测试管理能力就显得格外重要,要确保计划不折不扣的执行下去,测试经理的人际谐调能力,项目测试的操作经验、公司的质量现状都能够对项目测试产生足够的影响。另外,计划也是“动态的”!不必要把所有的因素都可能囊括进去,也不必要针对这种变化额外制定“计划的计划”,测试计划制定不能在项目开始后束之高阁,而是紧追项目的变化,实时进行思考和贯彻,根据现实修改,然后成功实施,这才能实现测试计划的最终目标――保证项目最终产品的质量!

  匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的,结果它在微软内部逐渐流行起来,并且推广给了全世界的Windows开发人员。

  命名规范不一定要遵守,不规范的代码一样可以运行,但是只有规范的代码才能让他人明白,也只有规范的代码才能更好的维护。

MFC、句柄、控件及结构的命名规范

Windows类型 样本变量 MFC类 样本变量
HWND hWnd; CWnd* pWnd;
HDLG hDlg; CDialog* pDlg;
HDC hDC; CDC* pDC;
HGDIOBJ hGdiObj; CGdiObject* pGdiObj;
HPEN hPen; CPen* pPen;
HBRUSH hBrush; CBrush* pBrush;
HFONT hFont; CFont* pFont;
HBITMAP hBitmap; CBitmap* pBitmap;
HPALETTE hPaltte; CPalette* pPalette;
HRGN hRgn; CRgn* pRgn;
HMENU hMenu; CMenu* pMenu;
HWND hCtl; CState* pState;
HWND hCtl; CButton* pButton;
HWND hCtl; CEdit* pEdit;
HWND hCtl; CListBox* pListBox;
HWND hCtl; CComboBox* pComboBox;
HWND hCtl; CScrollBar* pScrollBar;
HSZ hszStr; CString pStr;
POINT pt; CPoint pt;
SIZE size; CSize size;
RECT rect; CRect rect;

一般前缀命名规范

前缀 类型 实例
C 类或结构 CDocument,CPrintInfo
m_ 成员变量 m_pDoc,m_nCustomers

变量命名规范

前缀 类型 描述 实例
ch char 8位字符 chGrade
ch TCHAR 如果_UNICODE定义,则为16位字符 chName
b BOOL 布尔值 bEnable
n int 整型(其大小依赖于操作系统) nLength
n UINT 无符号值(其大小依赖于操作系统) nHeight
w WORD 16位无符号值 wPos
l LONG 32位有符号整型 lOffset
dw DWORD 32位无符号整型 dwRange
p * 指针 pDoc
lp FAR* 远指针 lpszName
lpsz LPSTR 32位字符串指针 lpszName
lpsz LPCSTR 32位常量字符串指针 lpszName
lpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针 lpszName
h handle Windows对象句柄 hWnd
lpfn callback 指向CALLBACK函数的远指针

应用程序符号命名规范

前缀 符号类型 实例 范围
IDR_ 不同类型的多个资源共享标识 IDR_MAIINFRAME 1~0×6FFF
IDD_ 对话框资源 IDD_SPELL_CHECK 1~0×6FFF
HIDD_ 对话框资源的Help上下文 HIDD_SPELL_CHECK 0×20001~0×26FF
IDB_ 位图资源 IDB_COMPANY_LOGO 1~0×6FFF
IDC_ 光标资源 IDC_PENCIL 1~0×6FFF
IDI_ 图标资源 IDI_NOTEPAD 1~0×6FFF
ID_ 来自菜单项或工具栏的命令 ID_TOOLS_SPELLING 0×8000~0xDFFF
HID_ 命令Help上下文 HID_TOOLS_SPELLING 0×18000~0×1DFFF
IDP_ 消息框提示 IDP_INVALID_PARTNO 8~0xDEEF
HIDP_ 消息框Help上下文 HIDP_INVALID_PARTNO 0×30008~0×3DEFF
IDS_ 串资源 IDS_COPYRIGHT 1~0×7EEF
IDC_ 对话框内的控件 IDC_RECALC 8~0xDEEF

Microsoft MFC宏命名规范

名称 类型
_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本
_ALPHA 仅编译DEC Alpha处理器
_DEBUG 包括诊断的调试版本
_MBCS 编译多字节字符集
_UNICODE 在一个应用程序中打开Unicode
AFXAPI MFC提供的函数
CALLBACK 通过指针回调的函数

库标识符命名法

标识符 值和含义
u ANSI(N)或Unicode(U)
d 调试或发行:D = 调试;忽略标识符为发行。

静态库版本命名规范

描述
NAFXCWD.LIB 调试版本:MFC静态连接库
NAFXCW.LIB 发行版本:MFC静态连接库
UAFXCWD.LIB 调试版本:具有Unicode支持的MFC静态连接库
UAFXCW.LIB 发行版本:具有Unicode支持的MFC静态连接库

动态连接库命名规范

名称

类型
_AFXDLL 唯一的动态连接库(DLL)版本
WINAPI Windows所提供的函数

Windows.h中新的命名规范

类型 定义描述
WINAPI 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型
CALLBACK 使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置
LPCSTR 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR*)
UINT 可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词
LRESULT 窗口程序返回值的类型
LPARAM 声明lParam所使用的类型,lParam是窗口程序的第四个参数
WPARAM 声明wParam所使用的类型,wParam是窗口程序的第三个参数
LPVOID 一般指针类型,与(void *)相同,可以用来代替LPSTR
        

匈牙利命名规范有很多弊端,例如使改变变量类型的工作变得十分艰巨。很多人已经不再遵守这个规范了。至于有什么弊端,大家可以看看这篇文章:

http://www.csdn.com.cn/program/4906.htm

From  :http://www.pconline.com.cn/diy/evalue/evalue/storage/0210/284937.html
Author:黄文
Date   :2002-10-10

要深入探讨Serial ATA技术,我们就要先来简单分析一下并行ATA与Serial ATA之间工作原理的差异:

  1.数据传输周期对传输速度的影响

  首先,我们先来探讨一下数据传输周期对传输速度的影响。现在的并行ATA标准使用的是16bit的双向总线,即1个数据传输周期可以传输4个字节的数据(1字节=8bit,16bit的双向总线一个周期可以传输16bit/8×2个字节),而大家熟知的Ultra ATA 100每秒可以传输100MB(100000000字节)的数据,通过一条简单的公式:

频率×一个周期的数据传输率=每秒数据传输率

  通过计算Ultra ATA100的时钟频率因该是100000000字节/4字节,即等于25000000Hz(25MHz),这也和我们查阅Ultra ATA接口技术规范所说的ATA 100进行一次数据传输的时钟频率是25MHz相一致,一个周期也就是40ns(单位时间/频率:1s/25MHz)。

  各种Ultra ATA接口规格一览:

要深入探讨Serial ATA技术,我们就要先来简单分析一下并行ATA与Serial ATA之间工作原理的差异:

  1.数据传输周期对传输速度的影响

  首先,我们先来探讨一下数据传输周期对传输速度的影响。现在的并行ATA标准使用的是16bit的双向总线,即1个数据传输周期可以传输4个字节的数据(1字节=8bit,16bit的双向总线一个周期可以传输16bit/8×2个字节),而大家熟知的Ultra ATA 100每秒可以传输100MB(100000000字节)的数据,通过一条简单的公式:

频率×一个周期的数据传输率=每秒数据传输率

  通过计算Ultra ATA100的时钟频率因该是100000000字节/4字节,即等于25000000Hz(25MHz),这也和我们查阅Ultra ATA接口技术规范所说的ATA 100进行一次数据传输的时钟频率是25MHz相一致,一个周期也就是40ns(单位时间/频率:1s/25MHz)。

  各种Ultra ATA接口规格一览:

Ultra DMA数据传输周期:

  但在数据传输中,两个连续的数据传输周期之间,有一个时间间隔,间隔时间为半个时钟周期,也就是20ns,但在另半个时钟周期中包括调整期、保持期和最大限度的数据传输时间。保持期是指数据需要在传输完成后保持一个特定的时间,而在两次数据传输中还有一个调整时间,在这段时间内,要做好传输数据的准备,ATAPI-6协议中规定调整期和保持期的时间都为4.8ns,而剩下的10.4ns的时间就是最大的数据传输时间。

  那传输周期和传输速度有什么关系呢?要增加传输速度就要减少等待时间(包括两个连续的时钟之间的时间间隔、调整期和保持期),最简单的方法就是缩短整个传输周期,所以Ultra ATA 133标准将时钟频率提高到33.3MHz,因此半个周期缩短到15ns,但ATAPI-6协议中规定调整期和保持期的时间都为4.8ns,不会改变,因此ATA 133只有5.4ns的数据传输时间,将是目前可能达到的最快速度了。

  而Serial ATA点对点直接传输的8位总线,根据Serial ATA数据传输规范:Serial ATA的时钟频率为150MHz,150MHz×8bit(1字节)=150MB,这刚好就是目前第一代Serial ATA的传输速率。 通过150MHz的时钟频率可以轻易的算出半个传输周期只有0.333ns(1个周期=1/150M),当然传输过程中的等待和数据调整时间也会相应的减少,因此大大提高了传输速度,这也是Serial ATA可以轻而易举上到1.5Gbit/s的原因,但0.333ns只是Serial ATA开始,将来还大有发展。

  2.不同于并行ATA的植入式的时钟系统

  那为什么Serial ATA能够达到那么高的频率呢?原因就在于Serial ATA和并行ATA依赖于外部时钟信号不同,Serial ATA有一个植入式的时钟,可以在处理信号和数据时使用。这种植入式的时钟实际上是将数据本身作为时钟信号一样的处理。这样做唯一潜在的问题就是当没有数据传输时,系统和存储器上的数据就不一定是同步的了。但是这个问题可以轻易解决,在空闲时发送“Dummy Singnal”,就像“1010101”式的没有意义的信号来保持两者的同步,由于不存在并行设备,信号不会出现不一致的情况。

  3.传输方式限制工作频率的高低

  那你会问并行ATA不可以提高传输频率吗?答案就是不可以太高,Ultra ATA使用通常的非互锁时钟信号,当频率太高时很容易导致线路电气性质的任何差异都可能带来时钟信号的不匹配,引起数据到达时间和传输信号的不一致,甚至将数据传到了别的数据接收端上。再则,并行ATA标准电压为5v,即使是ATA 100也要3.3v,每当数据在数据线中传递的时候,并行ATA的数据线就像个变压器一样,线缆的长度和电压的变化生成了变化的电磁场,影响其他数据线中的数据传递,如果并行ATA速率大副提高这种干扰还将直线上升。因此,ATA 33变成ATA 100时,扁平数据线上再加上了40根屏蔽线,这样,信号线、电源线、控制线之间都隔了一根线,可以有效的减少干扰,但这种解决的方法不可能继续发展下去。

  而对于Serial ATA采用了低电压微分信号(LVDS)技术和加上地线的数据线设计,轻松的解决了电磁场干扰的问题。LVDS指的是一种先进的信号传输方式,通过一对线来传递两个电压信号,而在这两个电压之间的就是实际的数据,使用较低的电压可以得到更快的传输速度,因为要传播的电子数量的减少,同样频率下带来速度的提升。数据线双向传递数据只需要4根数据线,再加上地线来提供相应的屏蔽,保证数据传输时不产生电磁场干扰,而线数从Ultra ATA的80线减少到了20线,实际上,Serial ATA使用的并不是平行排列的线缆,屏蔽线是通过同轴包裹数据线来实现,这使得数据线还可以继续加大直径,减少阻抗,提高抗干扰能力,也就可以进一步提高传送速度。

  Serial ATA的特点:

  1.更轻薄、更灵活的的接线

  相信常装机的朋友一定深有体会,机箱中最烦杂的就是各种各样的接线,既不美观,又妨碍散热,特别是粗大的数据线,而且它的最长距离只有40公分,在安装上极不灵活,要在大型直立机箱的最上方安装硬盘是及其困难的,不但如此,其接口还有正反之分,常常为了把硬盘安装在一个特定的地点,我们还要降线扭转一百八十度,如果你还要一条数据线上安装2台设备,那结果真是不敢想象。

  而当你见到Serial ATA的数据线线,你一定忍不住喜新厌旧。其接线可以长达一米,造型精致,即使是最宽的接线两端的接头也只有大约1厘米。即使你扭曲,打结也不影响其正常工作。最值得夸奖的是,它的接口不是针脚设计,而是平铺的接触片,不知道你有没有试过当Ultra ATA的数据线拔出硬盘的时候连同硬盘的针脚一起折断拔出,那种痛惜真是无可奈何,而Serial ATA将令你的这种担忧一扫而光。

  2.随心所欲、支持热插拔

  对于经常玩弄硬件的用户来说,Serial ATA的接口支持热插拔的特性是使他们最欣喜的了。Serial ATA的接口是单向性的,由于在接口上有防插错的设计,接口的一边长出来一部分,因此你不会插错;由于使用了针错列设计,接口中有两种长度的针,就可以实现顺序连接,最长的针总是最先接上,然后是短针。 Serial ATA将接口内长针是作为地线使用,这是个简便而又实用的设计,通过“接地”处理,“放电现象”这个实现设备热插拔的最大问题就可以妥善的解决。也就是说,当增加一个设备到系统中来时,首先接触的是长针,这就做到电学意义上的平衡来保护其他数据线,随即,设备依照设定的顺序连接,与主机建立联系,从而实现热插拔。有了热插拔技术,你可以随时增加Serial ATA设备,而且较新的操作系统能自动辨认新设备(Windows 98SE以后的系统),实现即插即用。

From  :http://tech.ccidnet.com/pub/article/c322_a204629_p1.html
Author:中国科学院软件研究所对象技术中心
Date   :2005.01.16
关键字:中间件


一、为什么要中间件

计算机技术迅速发展。从硬件技术看,CPU速度越来越高,处理能力越来越强;从软件技术看,应用程序的规模不断扩大,特别是Internet及WWW的出现,使计算机的应用范围更为广阔,许多应用程序需在网络环境的异构平台上运行。这一切都对新一代的软件开发提出了新的需求。在这种分布异构环境中,通常存在多种硬件系统平台(如PC,工作站,小型机等),在这些硬件平台上又存在各种各样的系统软件(如不同的操作系统、数据库、语言编译器等),以及多种风格各异的用户界面,这些硬件系统平台还可能采用不同的网络协议和网络体系结构连接。如何把这些系统集成起来并开发新的应用是一个非常现实而困难的问题。

二 什么是中间件

为解决分布异构问题,人们提出了中间件(middleware)的概念。中间件是位于平台(硬件和操作系统)和应用之间的通用服务,如图1所示,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现。

图1 中间件



也许很难给中间件一个严格的定义,但中间件应具有如下的一些特点:

满足大量应用的需要
运行于多种硬件和OS平台
支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互
支持标准的协议
支持标准的接口

由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。

三、主要中间件的分类

中间件所包括的范围十分广泛,针对不同的应用需求涌现出多种各具特色的中间件产品。但至今中间件还没有一个比较精确的定义,因此,在不同的角度或不同的层次上,对中间件的分类也会有所不同。由于中间件需要屏蔽分布环境中异构的操作系统和网络协议,它必须能够提供分布环境下的通讯服务,我们将这种通讯服务称之为平台。基于目的和实现机制的不同,我们将平台分为以下主要几类:

远程过程调用(Remote Procedure Call)
面向消息的中间件(Message-Oriented Middleware)
对象请求代理(Object Request Brokers)

它们可向上提供不同形式的通讯服务,包括同步、排队、订阅发布、广播等等,在这些基本的通讯平台之上,可构筑各种框架,为应用程序提供不同领域内的服务,如事务处理监控器、分布数据访问、对象事务管理器OTM等。平台为上层应用屏蔽了异构平台的差异,而其上的框架又定义了相应领域内的应用的系统结构、标准的服务组件等,用户只需告诉框架所关心的事件,然后提供处理这些事件的代码。当事件发生时,框架则会调用用户的代码。用户代码不用调用框架,用户程序也不必关心框架结构、执行流程、对系统级API的调用等,所有这些由框架负责完成。因此,基于中间件开发的应用具有良好的可扩充性、易管理性、高可用性和可移植性。

下面,针对几类主要的中间件分别加以简要的介绍。

1、远程过程调用

远程过程调用是一种广泛使用的分布式应用程序处理方法。一个应用程序使用RPC来“远程”执行一个位于不同地址空间里的过程,并且从效果上看和执行本地调用相同。事实上,一个RPC应用分为两个部分:server和client。server提供一个或多个远程过程;client向server发出远程调用。server和client可以位于同一台计算机,也可以位于不同的计算机,甚至运行在不同的操作系统之上。它们通过网络进行通讯。相应的stub和运行支持提供数据转换和通讯服务,从而屏蔽不同的操作系统和网络协议。在这里RPC通讯是同步的。采用线程可以进行异步调用。

在RPC模型中,client和server只要具备了相应的RPC接口,并且具有RPC运行支持,就可以完成相应的互操作,而不必限制于特定的server。因此,RPC为client/server分布式计算提供了有力的支持。同时,远程过程调用RPC所提供的是基于过程的服务访问,client与server进行直接连接,没有中间机构来处理请求,因此也具有一定的局限性。比如,RPC通常需要一些网络细节以定位server;在client发出请求的同时,要求server必须是活动的等等。

2、面向消息的中间件

MOM指的是利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可在分布环境下扩展进程间的通信,并支持多通讯协议、语言、应用程序、硬件和软件平台。目前流行的MOM中间件产品有IBM的MQSeries、BEA的MessageQ等。消息传递和排队技术有以下三个主要特点:

通讯程序可在不同的时间运行:程序不在网络上直接相互通话,而是间接地将消息放入消息队列,因为程序间没有直接的联系。所以它们不必同时运行。消息放入适当的队列时,目标程序甚至根本不需要正在运行;即使目标程序在运行,也不意味着要立即处理该消息。

对应用程序的结构没有约束:在复杂的应用场合中,通讯程序之间不仅可以是一对一的关系,还可以进行一对多和多对一方式,甚至是上述多种方式的组合。多种通讯方式的构造并没有增加应用程序的复杂性。

程序与网络复杂性相隔离: 程序将消息放入消息队列或从消息队列中取出消息来进行通讯,与此关联的全部活动,比如维护消息队列、维护程序和队列之间的关系、处理网络的重新启动和在网络中移动消息等是MOM的任务,程序不直接与其它程序通话,并且它们不涉及网络通讯的复杂性。

3、对象请求代理

随着对象技术与分布式计算技术的发展,两者相互结合形成了分布对象计算,并发展为当今软件技术的主流方向。1990年底,对象管理集团OMG首次推出对象管理结构OMA(Object Management Architecture),对象请求代理(Object Request Broker)是这个模型的核心组件。它的作用在于提供一个通信框架,透明地在异构的分布计算环境中传递对象请求。CORBA规范包括了ORB的所有标准接口。1991年推出的CORBA 1.1 定义了接口描述语言OMG IDL和支持Client/Server对象在具体的ORB上进行互操作的API。CORBA 2.0 规范描述的是不同厂商提供的ORB之间的互操作。

对象请求代理(ORB)是对象总线,它在CORBA规范中处于核心地位,定义异构环境下对象透明地发送请求和接收响应的基本机制,是建立对象之间client/server关系的中间件。ORB使得对象可以透明地向其他对象发出请求或接受其他对象的响应,这些对象可以位于本地也可以位于远程机器。ORB拦截请求调用,并负责找到可以实现请求的对象、传送参数、调用相应的方法、返回结果等。client对象并不知道同server对象通讯、激活或存储server对象的机制,也不必知道server对象位于何处、它是用何种语言实现的、使用什么操作系统或其他不属于对象接口的系统成分。

值得指出的是client和server角色只是用来协调对象之间的相互作用,根据相应的场合,ORB上的对象可以是client,也可以是server,甚至兼有两者。当对象发出一个请求时,它是处于client角色;当它在接收请求时,它就处于server角色。大部分的对象都是既扮演client角色又扮演server角色。另外由于ORB负责对象请求的传送和server的管理,client和server之间并不直接连接,因此,与RPC所支持的单纯的Client/Server结构相比,ORB可以支持更加复杂的结构。

4、事务处理监控

事务处理监控(Transaction processing monitors)最早出现在大型机上,为其提供支持大规模事务处理的可靠运行环境。随着分布计算技术的发展,分布应用系统对大规模的事务处理提出了需求,比如商业活动中大量的关键事务处理。事务处理监控界于client和server之间,进行事务管理与协调、负载平衡、失败恢复等,以提高系统的整体性能。它可以被看作是事务处理应用程序的“操作系统”。总体上来说,事务处理监控有以下功能:

进程管理,包括启动server进程、为其分配任务、监控其执行并对负载进行平衡。
事务管理,即保证在其监控下的事务处理的原子性、一致性、独立性和持久性。
通讯管理,为client和server之间提供了多种通讯机制,包括请求响应、会话、排队、订阅发布和广播等。
事务处理监控能够为大量的client提供服务,比如飞机定票系统。如果server为每一个client都分配其所需要的资源的话,那server将不堪重负(如图2所示)。但实际上,在同一时刻并不是所有的client都需要请求服务,而一旦某个client请求了服务,它希望得到快速的响应。事务处理监控在操作系统之上提供一组服务,对client请求进行管理并为其分配相应的服务进程,使server在有限的系统资源下能够高效地为大规模的客户提供服务。

图2 事务处理监控



四、面临的一些问题

中间件能够屏蔽操作系统和网络协议的差异,为应用程序提供多种通讯机制;并提供相应的平台以满足不同领域的需要。因此,中间件为应用程序了一个相对稳定的高层应用环境。然而,中间件服务也并非“万能药”。中间件所应遵循的一些原则离实际还有很大距离。多数流行的中间件服务使用专有的API和专有的协议,使得应用建立于单一厂家的产品,来自不同厂家的实现很难互操作。有些中间件服务只提供一些平台的实现,从而限制了应用在异构系统之间的移植。应用开发者在这些中间件服务之上建立自己的应用还要承担相当大的风险,随着技术的发展他们往往还需重写他们的系统。尽管中间件服务提高了分布计算的抽象化程度,但应用开发者还需面临许多艰难的设计选择,例如,开发者还需决定分布应用在client方和server方的功能分配。通常将表示服务放在client以方便使用显示设备,将数据服务放在server以靠近数据库,但也并非总是如此,何况其它应用功能如何分配也是不容易确定的。

(T113) 


                                                        


                                                   赛迪网中间件专题
http://tech.ccidnet.com/pub/series/s64.html


From  :http://www.56321.com/bbs/dispbbs.asp?boardID=31&ID=8787&page=1
Author:XSAI

端口:0
服务:Reserved
说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址为0.0.0.0,设置ACK位并在以太网层广播。


端口:1
服务:tcpmux
说明:这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下tcpmux在这种系统中被打开。Irix机器在发布是含有几个默认的无密码的帐户,如:IP、GUEST UUCP、NUUCP、DEMOS 、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。


端口:7
服务:Echo
说明:能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。


端口:19
服务:Character Generator
说明:这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。


端口:21
服务:FTP
说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。


端口:22
服务:Ssh
说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。


端口:23
服务:Telnet
说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。


端口:25
服务:SMTP
说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。


端口:31
服务:MSG Authentication
说明:木马Master Paradise、Hackers Paradise开放此端口。


端口:42
服务:WINS Replication
说明:WINS复制


端口:53
服务:Domain Name Server(DNS)
说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。


端口:67
服务:Bootstrap Protocol Server
说明:通过DSL和Cable modem的防火墙常会看见大量发送到广播地址255.255.255.255的数据。这些机器在向DHCP服务器请求一个地址。HACKER常进入它们,分配一个地址把自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可以发送的IP地址。


端口:69
服务:Trival File Transfer
说明:许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何 文件。它们也可用于系统写入文件。


端口:79
服务:Finger Server
说明:入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描。


端口:80
服务:HTTP
说明:用于网页浏览。木马Executor开放此端口。


端口:99
服务:Metagram Relay
说明:后门程序ncx99开放此端口。


端口:102
服务:Message transfer agent(MTA)-X.400 over TCP/IP
说明:消息传输代理。


端口:109
服务:Post Office Protocol -Version3
说明:POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交 换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。


端口:110
服务:SUN公司的RPC服务所有端口
说明:常见RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等


端口:113
服务:Authentication Service
说明:这是一个许多计算机上运行的协议,用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与E-MAIL服务器的缓慢连接。许多防火墙支持TCP连接的阻断过程中发回RST。这将会停止缓慢的连接。


端口:119
服务:Network News Transfer Protocol
说明:NEWS新闻组传输协议,承载USENET通信。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM。


端口:135
服务:Location Service
说明:Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111端口的功能很相似。使用DCOM和RPC的服务利用计算机上的end-point mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。HACKER扫描计算机的这个端口是为了找到这个计算机上运行Exchange Server吗?什么版本?还有些DOS攻击直接针对这个端口。


端口:137、138、139
服务:NETBIOS Name Service
说明:其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。


端口:143
服务:Interim Mail Access Protocol v2
说明:和POP3的安全问题一样,许多IMAP服务器存在有缓冲区溢出漏洞。记住:一种LINUX蠕虫(admv0rm)会通过这个端口繁殖,因此许多这个端口的扫描来自不知情的已经被感染的用户。当REDHAT在他们的LINUX发布版本中默认允许IMAP后,这些漏洞变的很流行。这一端口还被用于IMAP2,但并不流行。


端口:161
服务:SNMP
说明:SNMP允许远程管理设备。所有配置和运行信息的储存在数据库中,通过SNMP可获得这些信息。许多管理员的错误配置将被暴露在Internet。Cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络。


端口:177
服务:X Display Manager Control Protocol
说明:许多入侵者通过它访问X-windows操作台,它同时需要打开6000端口。


端口:389
服务:LDAP、ILS
说明:轻型目录访问协议和NetMeeting Internet Locator Server共用这一端口。


端口:443
服务:Https
说明:网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP。


端口:456
服务:[NULL]
说明:木马HACKERS PARADISE开放此端口。


端口:513
服务:Login,remote login
说明:是从使用cable modem或DSL登陆到子网中的UNIX计算机发出的广播。这些人为入侵者进入他们的系统提供了信息。


端口:544
服务:[NULL]
说明:kerberos kshell


端口:548
服务:Macintosh,File Services(AFP/IP)
说明:Macintosh,文件服务。


端口:553
服务:CORBA IIOP (UDP)
说明:使用cable modem、DSL或VLAN将会看到这个端口的广播。CORBA是一种面向对象的RPC系统。入侵者可以利用这些信息进入系统。


端口:555
服务:DSF
说明:木马PhAse1.0、Stealth Spy、IniKiller开放此端口。


端口:568
服务:Membership DPA
说明:成员资格 DPA。


端口:569
服务:Membership MSN
说明:成员资格 MSN。


端口:635
服务:mountd
说明:Linux的mountd Bug。这是扫描的一个流行BUG。大多数对这个端口的扫描是基于UDP的,但是基于TCP的mountd有所增加(mountd同时运行于两个端口)。记住mountd可运行于任何端口(到底是哪个端口,需要在端口111做portmap查询),只是Linux默认端口是635,就像NFS通常运行于2049端口。


端口:636
服务:LDAP
说明:SSL(Secure Sockets layer)


端口:666
服务:Doom Id Software
说明:木马Attack FTP、Satanz Backdoor开放此端口


端口:993
服务:IMAP
说明:SSL(Secure Sockets layer)


端口:1001、1011
服务:[NULL]
说明:木马Silencer、WebEx开放1001端口。木马Doly Trojan开放1011端口。


端口:1024
服务:Reserved
说明:它是动态端口的开始,许多程序并不在乎用哪个端口连接网络,它们请求系统为它们分配下一个闲置端口。基于这一点分配从端口1024开始。这就是说第一个向系统发出请求的会分配到1024端口。你可以重启机器,打开Telnet,再打开一个窗口运行natstat -a 将会看到Telnet被分配1024端口。还有SQL session也用此端口和5000端口。


端口:1025、1033
服务:1025:network blackjack 1033:[NULL]
说明:木马netspy开放这2个端口。


端口:1080
服务:SOCKS
说明:这一协议以通道方式穿过防火墙,允许防火墙后面的人通过一个IP地址访问INTERNET。理论上它应该只允许内部的通信向外到达INTERNET。但是由于错误的配置,它会允许位于防火墙外部的攻击穿过防火墙。WinGate常会发生这种错误,在加入IRC聊天室时常会看到这种情况。


端口:1170
服务:[NULL]
说明:木马Streaming Audio Trojan、Psyber Stream Server、Voice开放此端口。


端口:1234、1243、6711、6776
服务:[NULL]
说明:木马SubSeven2.0、Ultors Trojan开放1234、6776端口。木马SubSeven1.0/1.9开放1243、6711、6776端口。


端口:1245
服务:[NULL]
说明:木马Vodoo开放此端口。


端口:1433
服务:SQL
说明:Microsoft的SQL服务开放的端口。


端口:1492
服务:stone-design-1
说明:木马FTP99CMP开放此端口。


端口:1500
服务:RPC client fixed port session queries
说明:RPC客户固定端口会话查询


端口:1503
服务:NetMeeting T.120
说明:NetMeeting T.120


端口:1524
服务:ingress
说明:许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本。如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因。可以试试Telnet到用户的计算机上的这个端口,看看它是否会给你一个SHELL。连接到600/pcserver也存在这个问题。


端口:1600
服务:issd
说明:木马Shivka-Burka开放此端口。


端口:1720
服务:NetMeeting
说明:NetMeeting H.233 call Setup。


端口:1731
服务:NetMeeting Audio Call Control
说明:NetMeeting音频调用控制。


端口:1807
服务:[NULL]
说明:木马SpySender开放此端口。


端口:1981
服务:[NULL]
说明:木马ShockRave开放此端口。


端口:1999
服务:cisco identification port
说明:木马BackDoor开放此端口。


端口:2000
服务:[NULL]
说明:木马GirlFriend 1.3、Millenium 1.0开放此端口。


端口:2001
服务:[NULL]
说明:木马Millenium 1.0、Trojan Cow开放此端口。


端口:2023
服务:xinuexpansion 4
说明:木马Pass Ripper开放此端口。


端口:2049
服务:NFS
说明:NFS程序常运行于这个端口。通常需要访问Portmapper查询这个服务运行于哪个端口。


端口:2115
服务:[NULL]
说明:木马Bugs开放此端口。


端口:2140、3150
服务:[NULL]
说明:木马Deep Throat 1.0/3.0开放此端口。


端口:2500
服务:RPC client using a fixed port session replication
说明:应用固定端口会话复制的RPC客户


端口:2583
服务:[NULL]
说明:木马Wincrash 2.0开放此端口。


端口:2801
服务:[NULL]
说明:木马Phineas Phucker开放此端口。


端口:3024、4092
服务:[NULL]
说明:木马WinCrash开放此端口。

端口:3128
服务:squid
说明:这是squid HTTP代理服务器的默认端口。攻击者扫描这个端口是为了搜寻一个代理服务器而匿名访问Internet。也会看到搜索其他代理服务器的端口8000、8001、8080、8888。扫描这个端口的另一个原因是用户正在进入聊天室。其他用户也会检验这个端口以确定用户的机器是否支持代理。

端口:3129
服务:[NULL]
说明:木马Master Paradise开放此端口。

端口:3150
服务:[NULL]
说明:木马The Invasor开放此端口。

端口:3210、4321
服务:[NULL]
说明:木马SchoolBus开放此端口

端口:3333
服务:dec-notes
说明:木马Prosiak开放此端口

端口:3389
服务:超级终端
说明:WINDOWS 2000终端开放此端口。

端口:3700
服务:[NULL]
说明:木马Portal of Doom开放此端口

端口:3996、4060
服务:[NULL]
说明:木马RemoteAnything开放此端口

端口:4000
服务:QQ客户端
说明:腾讯QQ客户端开放此端口。

端口:4092
服务:[NULL]
说明:木马WinCrash开放此端口。

端口:4590
服务:[NULL]
说明:木马ICQTrojan开放此端口。

端口:5000、5001、5321、50505
服务:[NULL]
说明:木马blazer5开放5000端口。木马Sockets de Troie开放5000、5001、5321、50505端口。

端口:5400、5401、5402
服务:[NULL]
说明:木马Blade Runner开放此端口。

端口:5550
服务:[NULL]
说明:木马xtcp开放此端口。

端口:5569
服务:[NULL]
说明:木马Robo-Hack开放此端口。

端口:5632
服务:pcAnywere
说明:有时会看到很多这个端口的扫描,这依赖于用户所在的位置。当用户打开pcAnywere时,它会自动扫描局域网C类网以寻找可能的代理(这里的代理是指agent而不是proxy)。入侵者也会寻找开放这种服务的计算机。,所以应该查看这种扫描的源地址。一些搜寻pcAnywere的扫描包常含端口22的UDP数据包。

端口:5742
服务:[NULL]
说明:木马WinCrash1.03开放此端口。

端口:6267
服务:[NULL]
说明:木马广外女生开放此端口。

端口:6400
服务:[NULL]
说明:木马The tHing开放此端口。

端口:6670、6671
服务:[NULL]
说明:木马Deep Throat开放6670端口。而Deep Throat 3.0开放6671端口。

端口:6883
服务:[NULL]
说明:木马DeltaSource开放此端口。

端口:6969
服务:[NULL]
说明:木马Gatecrasher、Priority开放此端口。

端口:6970
服务:RealAudio
说明:RealAudio客户将从服务器的6970-7170的UDP端口接收音频数据流。这是由TCP-7070端口外向控制连接设置的。

端口:7000
服务:[NULL]
说明:木马Remote Grab开放此端口。

端口:7300、7301、7306、7307、7308
服务:[NULL]
说明:木马NetMonitor开放此端口。另外NetSpy1.0也开放7306端口。

端口:7323
服务:[NULL]
说明:Sygate服务器端。

端口:7626
服务:[NULL]
说明:木马Giscier开放此端口。

端口:7789
服务:[NULL]
说明:木马ICKiller开放此端口。

端口:8000
服务:OICQ
说明:腾讯QQ服务器端开放此端口。

端口:8010
服务:Wingate
说明:Wingate代理开放此端口。

端口:8080
服务:代理端口
说明:WWW代理开放此端口。

端口:9400、9401、9402
服务:[NULL]
说明:木马Incommand 1.0开放此端口。

端口:9872、9873、9874、9875、10067、10167
服务:[NULL]
说明:木马Portal of Doom开放此端口。

端口:9989
服务:[NULL]
说明:木马iNi-Killer开放此端口。

端口:11000
服务:[NULL]
说明:木马SennaSpy开放此端口。

端口:11223
服务:[NULL]
说明:木马Progenic trojan开放此端口。

端口:12076、61466
服务:[NULL]
说明:木马Telecommando开放此端口。

端口:12223
服务:[NULL]
说明:木马Hack’99 KeyLogger开放此端口。

端口:12345、12346
服务:[NULL]
说明:木马NetBus1.60/1.70、GabanBus开放此端口。

端口:12361
服务:[NULL]
说明:木马Whack-a-mole开放此端口。

端口:13223
服务:PowWow
说明:PowWow是Tribal Voice的聊天程序。它允许用户在此端口打开私人聊天的连接。这一程序对于建立连接非常具有攻击性。它会驻扎在这个TCP端口等回应。造成类似心跳间隔的连接请求。如果一个拨号用户从另一个聊天者手中继承了IP地址就会发生好象有很多不同的人在测试这个端口的情况。这一协议使用OPNG作为其连接请求的前4个字节。

端口:16969
服务:[NULL]
说明:木马Priority开放此端口。

端口:17027
服务:Conducent
说明:这是一个外向连接。这是由于公司内部有人安装了带有Conducent"adbot"的共享软件。Conducent"adbot"是为共享软件显示广告服务的。使用这种服务的一种流行的软件是Pkware。

端口:19191
服务:[NULL]
说明:木马蓝色火焰开放此端口。

端口:20000、20001
服务:[NULL]
说明:木马Millennium开放此端口。

端口:20034
服务:[NULL]
说明:木马NetBus Pro开放此端口。

端口:21554
服务:[NULL]
说明:木马GirlFriend开放此端口。

端口:22222
服务:[NULL]
说明:木马Prosiak开放此端口。

端口:23456
服务:[NULL]
说明:木马Evil FTP、Ugly FTP开放此端口。

端口:26274、47262
服务:[NULL]
说明:木马Delta开放此端口。

端口:27374
服务:[NULL]
说明:木马Subseven 2.1开放此端口。

端口:30100
服务:[NULL]
说明:木马NetSphere开放此端口。

端口:30303
服务:[NULL]
说明:木马Socket23开放此端口。

端口:30999
服务:[NULL]
说明:木马Kuang开放此端口。

端口:31337、31338
服务:[NULL]
说明:木马BO(Back Orifice)开放此端口。另外木马DeepBO也开放31338端口。

端口:31339
服务:[NULL]
说明:木马NetSpy DK开放此端口。

端口:31666
服务:[NULL]
说明:木马BOWhack开放此端口。

端口:33333
服务:[NULL]
说明:木马Prosiak开放此端口。

端口:34324
服务:[NULL]
说明:木马Tiny Telnet Server、BigGluck、TN开放此端口。

端口:40412
服务:[NULL]
说明:木马The Spy开放此端口。

端口:40421、40422、40423、40426、
服务:[NULL]
说明:木马Masters Paradise开放此端口。

端口:43210、54321
服务:[NULL]
说明:木马SchoolBus 1.0/2.0开放此端口。

端口:44445
服务:[NULL]
说明:木马Happypig开放此端口。

端口:50766
服务:[NULL]
说明:木马Fore开放此端口。

端口:53001
服务:[NULL]
说明:木马Remote Windows Shutdown开放此端口。

端口:65000
服务:[NULL]
说明:木马Devil 1.03开放此端口。

端口:88
说明:Kerberos krb5。另外TCP的88端口也是这个用途。

端口:137
说明:SQL Named Pipes encryption over other protocols name lookup(其他协议名称查找上的SQL命名管道加密技术)和SQL RPC encryption over other protocols name lookup(其他协议名称查找上的SQL RPC加密技术)和Wins NetBT name service(WINS NetBT名称服务)和Wins Proxy都用这个端口。

端口:161
说明:Simple Network Management Protocol(SMTP)(简单网络管理协议)。

端口:162
说明:SNMP Trap(SNMP陷阱)

端口:445
说明:Common Internet File System(CIFS)(公共Internet文件系统)

端口:464
说明:Kerberos kpasswd(v5)。另外TCP的464端口也是这个用途。

端口:500
说明:Internet Key Exchange(IKE)(Internet密钥交换)

端口:1645、1812
说明:Remot Authentication Dial-In User Service(RADIUS)authentication(Routing and Remote Access)(远程认证拨号用户服务)

端口:1646、1813
说明:RADIUS accounting(Routing and Remote Access)(RADIUS记帐(路由和远程访问))

端口:1701
说明:Layer Two Tunneling Protocol(L2TP)(第2层隧道协议)

端口:1801、3527
说明:Microsoft Message Queue Server(Microsoft消息队列服务器)。还有TCP的135、1801、2101、2103、2105也是同样的用途。

端口:2504
说明:Network Load Balancing(网络平衡负荷)

下面是:系统常用的端口

7 TCP Echo 简单 TCP/IP 服务
7 UDP Echo 简单 TCP/IP 服务
9 TCP Discard 简单 TCP/IP 服务
9 UDP Discard 简单 TCP/IP 服务
13 TCP Daytime 简单 TCP/IP 服务
13 UDP Daytime 简单 TCP/IP 服务
17 TCP Quotd 简单 TCP/IP 服务
17 UDP Quotd 简单 TCP/IP 服务
19 TCP Chargen 简单 TCP/IP 服务
19 UDP Chargen 简单 TCP/IP 服务
20 TCP FTP 默认数据 FTP 发布服务
21 TCP FTP 控制 FTP 发布服务
21 TCP FTP 控制 应用层网关服务
23 TCP Telnet Telnet
25 TCP SMTP 简单邮件传输协议
25 UDP SMTP 简单邮件传输协议
25 TCP SMTP Exchange Server
25 UDP SMTP Exchange Server
42 TCP WINS 复制 Windows Internet 名称服务
42 UDP WINS 复制 Windows Internet 名称服务
53 TCP DNS DNS 服务器
53 UDP DNS DNS 服务器
53 TCP DNS Internet 连接防火墙/Internet 连接共享
53 UDP DNS Internet 连接防火墙/Internet 连接共享
67 UDP DHCP 服务器 DHCP 服务器
67 UDP DHCP 服务器 Internet 连接防火墙/Internet 连接共享
69 UDP TFTP 普通 FTP 后台程序服务
80 TCP HTTP Windows 媒体服务
80 TCP HTTP 万维网发布服务
80 TCP HTTP SharePoint Portal Server
88 TCP Kerberos Kerberos 密钥分发中心
88 UDP Kerberos Kerberos 密钥分发中心
102 TCP X.400 Microsoft Exchange MTA 堆栈
110 TCP POP3 Microsoft POP3 服务
110 TCP POP3 Exchange Server
119 TCP NNTP 网络新闻传输协议
123 UDP NTP Windows Time
123 UDP SNTP Windows Time
135 TCP RPC 消息队列
135 TCP RPC 远程过程调用
135 TCP RPC Exchange Server
137 TCP NetBIOS 名称解析 计算机浏览器
137 UDP NetBIOS 名称解析 计算机浏览器
137 TCP NetBIOS 名称解析 Server
137 UDP NetBIOS 名称解析 Server
137 TCP NetBIOS 名称解析 Windows Internet 名称服务
137 UDP NetBIOS 名称解析 Windows Internet 名称服务
137 TCP NetBIOS 名称解析 Net Logon
137 UDP NetBIOS 名称解析 Net Logon
137 TCP NetBIOS 名称解析 Systems Management Server 2.0
137 UDP NetBIOS 名称解析 Systems Management Server 2.0
138 UDP NetBIOS 数据报服务 计算机浏览器
138 UDP NetBIOS 数据报服务 信使
138 UDP NetBIOS 数据报服务 服务器
138 UDP NetBIOS 数据报服务 Net Logon
138 UDP NetBIOS 数据报服务 分布式文件系统
138 UDP NetBIOS 数据报服务 Systems Management Server 2.0
138 UDP NetBIOS 数据报服务 许可证记录服务
139 TCP NetBIOS 会话服务 计算机浏览器
139 TCP NetBIOS 会话服务 传真服务
139 TCP NetBIOS 会话服务 性能日志和警报
139 TCP NetBIOS 会话服务 后台打印程序
139 TCP NetBIOS 会话服务 服务器
139 TCP NetBIOS 会话服务 Net Logon
139 TCP NetBIOS 会话服务 远程过程调用定位器
139 TCP NetBIOS 会话服务 分布式文件系统
139 TCP NetBIOS 会话服务 Systems Management Server 2.0
139 TCP NetBIOS 会话服务 许可证记录服务
143 TCP IMAP Exchange Server
161 UDP SNMP SNMP 服务
162 UDP SNMP 陷阱出站 SNMP 陷阱服务
389 TCP LDAP 服务器 本地安全机构
389 UDP LDAP 服务器 本地安全机构
389 TCP LDAP 服务器 分布式文件系统
389 UDP LDAP 服务器 分布式文件系统
443 TCP HTTPS HTTP SSL
443 TCP HTTPS 万维网发布服务
443 TCP HTTPS SharePoint Portal Server
445 TCP SMB 传真服务
445 UDP SMB 传真服务
445 TCP SMB 后台打印程序
445 UDP SMB 后台打印程序
445 TCP SMB 服务器
445 UDP SMB 服务器
445 TCP SMB 远程过程调用定位器
445 UDP SMB 远程过程调用定位器
445 TCP SMB 分布式文件系统
445 UDP SMB 分布式文件系统
445 TCP SMB 许可证记录服务
445 UDP SMB 许可证记录服务
500 UDP IPSec ISAKMP IPSec 服务
515 TCP LPD TCP/IP 打印服务器
548 TCP Macintosh 文件服务器 Macintosh 文件服务器
554 TCP RTSP Windows 媒体服务
563 TCP NNTP over SSL 网络新闻传输协议
593 TCP RPC over HTTP 远程过程调用
593 TCP RPC over HTTP Exchange Server
636 TCP LDAP SSL 本地安全机构
636 UDP LDAP SSL 本地安全机构
993 TCP IMAP over SSL Exchange Server
995 TCP POP3 over SSL Exchange Server
1270 TCP MOM-Encrypted Microsoft Operations Manager 2000
1433 TCP SQL over TCP Microsoft SQL Server
1433 TCP SQL over TCP MSSQL$UDDI
1434 UDP SQL Probe Microsoft SQL Server
1434 UDP SQL Probe MSSQL$UDDI
1645 UDP 旧式 RADIUS Internet 身份验证服务
1646 UDP 旧式 RADIUS Internet 身份验证服务
1701 UDP L2TP 路由和远程访问
1723 TCP PPTP 路由和远程访问
1755 TCP MMS Windows 媒体服务
1755 UDP MMS Windows 媒体服务
1801 TCP MSMQ 消息队列
1801 UDP MSMQ 消息队列
1812 UDP RADIUS 身份验证 Internet 身份验证服务
1813 UDP RADIUS 计帐 Internet 身份验证服务
1900 UDP SSDP SSDP 发现服务
2101 TCP MSMQ-DC 消息队列
2103 TCP MSMQ-RPC 消息队列
2105 TCP MSMQ-RPC 消息队列
2107 TCP MSMQ-Mgmt 消息队列
2393 TCP OLAP Services 7.0 SQL Server:下层 OLAP 客户端支持
2394 TCP OLAP Services 7.0 SQL Server:下层 OLAP 客户端支持
2460 UDP MS Theater Windows 媒体服务
2535 UDP MADCAP DHCP 服务器
2701 TCP SMS 远程控制(控件) SMS 远程控制代理
2701 UDP SMS 远程控制(控件) SMS 远程控制代理
2702 TCP SMS 远程控制(数据) SMS 远程控制代理
2702 UDP SMS 远程控制(数据) SMS 远程控制代理
2703 TCP SMS 远程聊天 SMS 远程控制代理
2703 UPD SMS 远程聊天 SMS 远程控制代理
2704 TCP SMS 远程文件传输 SMS 远程控制代理
2704 UDP SMS 远程文件传输 SMS 远程控制代理
2725 TCP SQL 分析服务 SQL 分析服务器
2869 TCP UPNP 通用即插即用设备主机
2869 TCP SSDP 事件通知 SSDP 发现服务
3268 TCP 全局编录服务器 本地安全机构
3269 TCP 全局编录服务器 本地安全机构
3343 UDP 集群服务 集群服务
3389 TCP 终端服务 NetMeeting 远程桌面共享
3389 TCP 终端服务 终端服务
3527 UDP MSMQ-Ping 消息队列
4011 UDP BINL 远程安装
4500 UDP NAT-T 路由和远程访问
5000 TCP SSDP 旧事件通知 SSDP 发现服务
5004 UDP RTP Windows 媒体服务
5005 UDP RTCP Windows 媒体服务
42424 TCP ASP.Net 会话状态 ASP.NET 状态服务
51515 TCP MOM-Clear Microsoft Operations Manager 2000

From  :http://www.fixdown.com/article/article/1747.htm
Author:Anonymous
Date   :2004-02-19

一、动态域名的实现
  1.动态域名基础
  搭建Linux服务器是一个系统工程,涉及到硬件购置、软件安装、域名申请、网络服务提供等。这里的前提就是域名的申请,因为对于虚拟拨号上网的用户而言,使用的都是动态IP地址,别人根本无法和你联系。

  解决的办法就是采用动态域名解析工具,通过运行一个专门的客户端程序,一旦拨号用户上线,就会把当前的动态IP地址发送到专门的动态域名解析服务器,然后该动态域名解析服务器就可以及时更新自己的数据库,把某个“固定”域名指向该临时IP地址。这样,不管现在的IP地址是多少,总是可以通过一个固定的域名来访问我们的Linux服务器。

  需要注意的是,计算机所拥有的IP地址应该是公网IP地址,也就是Internet所采用的IP地址,而非内网(局域网)IP地址。

  2.动态域名解析
  (1)注册动态域名

  我们可以到科迈网http://www.comexe.cn/register.php注册一个用户账户。然后在“域名管理”页面中单击“申请科迈公网免费二级域名”链接,注册一个合适的名称(例如myname),即会得到一个myname.kmip.net的二级域名,然后单击“提交”按钮,如果该域名没有被别人注册,则可以立即生效。

  注意:本文假设用户已经完全安装Red Hat Linux 9.0,并使用KDE桌面系统。

  (2)安装动态域名解析工具

  注册成功以后,我们可以到http://www.comexe.cn/client/linux_i.tar.gz中下载动态域名解析工具(如,版本号“公网Ver 2.00 Build 104”)。下载得到的是一个压缩文件,在系统里建立一个目录,如/usr/local/comexe,把下载的文件解压到这个目录即可。

  [root@ahpeng root]# cd /tmp

  [root@ahpeng tmp]# tar -xvzf linux_i.tar.gz

  [root@ahpeng tmp]# cp pipclient /usr/local/comexe/pipclient

  (3)配置客户端

  解压后得到一个执行文件pipclient。在终端命令窗口切换到该目录并运行以下命令:

  [root@ahpeng comexe]# ./ pipclient

  第一次运行pipclient,会要求输入配置信息:

  [root@ahpeng comexe]# ./ pipclient

  Usage: pipclient -h -c -w /home/pipclient

  -h: help message.

  -c: do configuration.

  -w <dir>: set work directory.

  Do configuration now.

  Input User name: 

  这里按照屏幕提示输入以下配置信息:

  Input User name:   //在科迈网注册的用户名

  Input Password:    //科迈网用户密码

  Input Domain:     //域名

  Input Offline URL or Offline IP(Enter for none): //域名离线URL。如果没有请直接按回车键。这里要注意离线功能对科迈的二级域名(如abc.dns0755.net、abc.kmip.net)无效

  Has another domain?(Y/N):  //如果要解析多个域名,请按“Y”,逐个输入域名及其离线URL

  配置完毕后应该出现以下提示信息:

  030827 155904:MESG:

  COMEXE DDNS (Public IP) Ver 2.00a Build 102

  Copyright 2003 Shenzhen COMEXE Communication Technology Co. Ltd.

  All Rights Reserved.

  http://www.comexe.cn

  030827 155904:MESG:服务启动.

  030827 155904:INFO:Connected to:210.22.12.54:9994

  030827 155904:INFO:Connected to:210.22.12.54:9993

  030827 155904:MESG:登录成功! 出口IP是: xxx.xxx.xxx.xxx

  030827 155904:INFO:xxx.xxx.xxx.xxx N 20 

  现在可以按Ctrl+C组合键退出。如果以后要修改配置,可以在终端命令窗口运行以下命令:

  [root@ahpeng comexe]#./pipclient -c

  3.内网映射
  所谓内网(局域网),就是只有一台主机(可能是代理服务器或路由器)连接到Internet,具有公网地址,假设为A1。别的计算机通过它与Internet连接,假设为A2,只有内网地址,外网计算机显然无法直接访问A2。

  要让外网用户可以访问Linux服务器,通常有三种解决思路:

  (1)如果A1是Windows主机

  如果A1是Windows主机,可以考虑安装端口映射工具,如PortTunnel,把外网计算机对A1特定端口的访问,转驳到对A2特定端口的访问。

  (2)如果你采用路由器

  如果你采用路由器,或具有路由功能的ADSL Modem,可以直接在路由器上进行设置。这里以AboveCable无线路由器为例进行介绍:

  首先在浏览器地址栏中输入“192.168.100.100”,回车进入路由器设置界面,输入密码即可进入管理界面。展开页面左侧的“重定向规则→虚拟主机”链接,然后在右侧页面中依次填上服务端口、服务器IP地址,这样外网对路由器的特定端口访问,都会被转驳到指定服务器的端口。

  (3)下载客户端程序

  登录到http://www.comexe.cn/helptruehost.php下载一个特殊的客户端程序,不过这需要支付一定的费用、并且带宽受到限制(通过专门的服务器中转),它可以实现内网用户对外提供服务。

  4.内置防火墙的配置
  在搭建Linux网站时,还有一个很容易疏忽的问题,即是没有正确配置系统内置的防火墙,这可能会导致“客户”无法访问我们的Linux服务器,所以必须对防火墙进行配置。单击“主菜单→系统设置→安全级别”菜单项,即可打开“安全级别配置”对话框,如图1所示。选中“定制”选项,然后选择所需启用的服务,例如WWW、FTP、邮件(SMTP)等,最后单击“确定”按钮即可。

——————————————————————————–
lsw 回复于:2004-02-18 12:03:58
二、架设Web服务器
  Apache是使用范围最广的Web服务器工具套件,这里我们将详细介绍如何在Red Hat Linux 9.0环境里安装、启动和配置Apache服务器。

  1.安装Apache服务器
  在安装Red Hat Linux 9.0时,会提示是否安装Apache服务器。如果不能确定是否已经安装,可以在终端命令窗口输入以下命令:

  [root@ahpeng root] rpm -qa | grep httpd

  如果结果显示为“httpd-2.0.40-21”,则说明系统已经安装Apache服务器。

  如果安装Red Hat Linux 9.0时没有选择Apache服务器,则可以在图形环境下单击“主菜单→系统设置→添加删除应用程序”菜单项,在出现的“软件包管理”对话框里确保选中“万维网服务器”选项,然后单击“更新”按钮,按照屏幕提示插入安装光盘即可开始安装。

  另外,你也可以直接插入第1张安装光盘,定位到/RedHat/RPMS下的httpd-2.0.40-21.i386.rpm安装包,然后在终端命令窗口运行以下命令即可开始安装进程:

  [root@ahpeng RPMS] rpm -ivh httpd-2.0.40-21.i386.rpm

  安装好Apache服务器,可以在终端命令窗口运行以下命令来启动Apache服务:

  [root@ahpeng root] /etc/rc.d/init.d/httpd start

  重新启动Apache服务:

  [root@ahpeng root] /etc/rc.d/init.d/httpd restart

  关闭Apache服务:

  [root@ahpeng root] /etc/rc.d/init.d/httpd stop

  确认Apache服务已经启动后,我们可以在Web浏览器里输入以下地址,如果可以看到默认的Apache首页,则说明Apache服务器工作正常。

  Htpp://WebServerAddress

  此处的WebServerAddress指代Web服务器的IP地址或者域名。即是说WebServerAddress应该用实际的Web服务器的IP地址或者域名来代替。

  2.配置httpd.conf文件
  在早期Apache服务器版本里,其配置内容分散在httpd.conf、srm.conf、access.conf三个文件里。而新版本的Apache服务器,则统一在httpd.conf里进行配置。对于默认安装的Red Hat Linux来说,该配置文件位于/etc/httpd/conf目录下,如果安装的是tar.gz版本,则该文件位于/usr/local/apache/conf目录。

  利用httpd.conf,我们可以对Apache服务器进行全局配置、主要或预设服务器的参数定义、虚拟主机的设置。httpd.conf是一个文本文件,我们可以用Vi、Kate等文本编辑工具进行修改。通过分析该httpd.conf配置文件,我们不难发现:

  该配置文件分为若干个小节,例如Section 1: Global Environment(第一小节:全局环境);Section 2: ‘Main’ server configuration(第二小节:主服务器配置)等。

  每个小节都有若干个配置参数,其表达形式为“配置参数名称 具体值”,每个配置参数都有详尽的英文解释(用#号引导每一个注释行)。

  为了帮助大家理解,这里给出httpd.conf的最常用配置参数:

  (1)DocumentRoot

  该参数指定Apache服务器存放网页的路径,默认所有要求提供HTTP服务的连接,都以这个目录为主目录。以下为Apache的默认值:

  DocumentRoot "/var/www/html"

  (2)MaxClients

  该参数限制Apache所能提供服务的最高数值,即同一时间连接的数目不能超过这个数值。一旦连接数目达到这个限制,Apache服务器则不再为别的连接提供服务,以免系统性能大幅度下降。本例假设最大连接数是150个:

  MaxClients 150

  (3)Port

  该参数用来指定Apache服务器的监听端口。一般来说,标准的HTTP服务默认端口号是80,一般不要更改这个数值。本例为80端口:

  Port 80

  (4)ServerName

  该参数使得用户可以自行设置主机名,以取代安装Apache服务器主机的真实名字。此名字必须是已经在DNS服务器上注册的主机名。如果当前主机没有已注册的名字,也可以指定IP地址。本例将服务器名设为Peter.vicp.net:

  ServerName Peter.vicp.net

  (5)MaxKeepAliveRequests

  当使用保持连接(Persistent Connection)功能时,可以使用本参数决定每次连接所能发出的要求数目的上限。如果此数值为0,则表示没有限制。建议尽可能使用较高的数值,以充分发挥Apache的高性能,本例设置每次连接所能发出的要求数目上限为100:

  MaxKeepAliveRequests 100

  (6)MaxRequestsPerChild

  该参数限制每个子进程(Child Process)在结束前所能处理的请求数目,一旦达到该数目,这个子进程就会被中止,以避免长时间占据Apache(或者Apache服务器所采用的函数库),防止造成内存或者其他系统资源的超负荷。

  需要注意的是,该参数的数值并不包括保持连接所发出的请求数目。举例说明,如果某个子进程负责某一个请求,该请求随后带来保持连接功能所需的10个请求,这时候对于该参数而言,Apache服务器会认为这个子进程只处理了1个要求,而非11个要求。

  以下设置最多可以处理10个要求:

  MaxRequestsPerChild 10

  (7)MaxSpareServers 和MinSpareServers

  提供Web服务的HTTP守护进程,其数目会随连接的数目而变动。Apache服务器采用动态调整的方法,维持足够的HTTP守护进程数目,以处理目前的负载,也就是同时保持一定的空闲HTTP守护进程来等候新的连接请求。

  Apache会定期检查有多少个HTTP守护进程正在等待连接请求,如果空闲的HTTP守护进程多于MaxSpareServers参数指定的值,则Apache会终止某些空闲进程;如果空闲HTTP守护进程少于MinSpareServers参数指定的值,则Apache会产生新的HTTP守护进程。本例将最高空闲守护进程设置为20个,将最低的空闲守护进程设置为5个:

  MaxSpareServers 20

  MinSpareServers 5

  当然这只是Apache的一些基本设置项,大家可以根据自己的实际情况加以灵活的修改,以充分发挥Apache的潜能。如果修改配置文件之后没能立即生效,可以重启Apache服务。

  注意:修改之前一定要先备份!

  3.图形化配置界面
  图形化配置直观、简单,足够应付Apache服务器的日常管理维护工作。我们可以通过单击“主菜单→系统设置→服务器设置→HTTP服务器”菜单项,或者直接在“运行命令”对话框里输入“apacheconf”命令并回车,来访问“Apache配置”对话框。可以看到该配置对话框共有4个标签页。

  (1)“主”标签页

  在“服务器名”框中可以输入服务器的名称,等同于httpd.conf文件里的“ServerName”字段。“网主电子邮件地址”框中可以输入管理员的邮件地址,等同于httpd.conf文件里的“ServerAdmin”字段。单击“可用地址”选项组中的“添加”(或者“编辑”)按钮,我们可以添加或者修改服务器的IP地址和端口。

  (2)“虚拟主机”标签页

  所谓的虚拟主机服务就是指将一台计算机虚拟成多台Web服务器。利用Apache服务器提供的“虚拟主机”服务,我们可以利用一台计算机提供多个Web服务。

  用Apache设置虚拟主机服务通常可以采用两种方案:基于IP地址的虚拟主机和基于名字的虚拟主机。基于IP地址的虚拟主机的实现方法有一个严重的不足,每增加一个虚拟主机,就必须增加一个IP地址。所以这里介绍如何创建基于名字的虚拟主机。

  假设一台Apache服务器的IP地址是210.79.81.212,主机名称为www.companyname.net,同时它拥有两个别名:sales.companyname.net、marketing.companyname.net。虽然这3个网站的IP地址相同,都指向210.79.81.212,但是由于架设了基于名字的虚拟主机,所以可以指向不同的网页。

  设置时,请单击“虚拟主机”标签页上的“添加”按钮,在打开的配置对话框的“主机信息”下拉列表框里选中“基于名称的虚拟主机”选项,然后输入合适的数据IP地址、主机名称等,记住,还要添加合适的别名,如图2所示。

  “Apache配置”对话框的其他两个标签页的设置内容基本等同于前面所介绍的httpd.conf参数配置,这里就不再介绍了。

——————————————————————————–
lsw 回复于:2004-02-18 12:04:28
三、架设FTP服务器
  FTP,即File Transfer Protocol,文件传输协议。它是目前Internet上最流行的数据传送方法之一。利用FTP协议,我们可以在FTP服务器和FTP客户端之间进行双向数据传输,既可以把数据从FTP服务器上下载到本地客户端,又可以从客户端上传数据到远程FTP服务器。

  1.安装vsftpd服务器
  vsftpd是目前Linux最好的FTP服务器工具之一,其中的vs就是“Very Secure”(很安全)的缩写,可见它的最大优点就是安全,除此之外,它还具有体积小,可定制强,效率高的优点。

  如果选择完全安装Red Hat Linux 9.0,则系统会默认安装vsftpd服务器。我们可以在终端命令窗口输入以下命令进行验证:

  [root@ahpeng root] rpm -qa | grep vsftpd

  如果结果显示为“vsftpd-1.1.3-8”,则说明系统已经安装vsftpd服务器。如果安装Red Hat Linux 9.0时没有选择vsftpd服务器,则可以在图形环境下单击“主菜单→系统设置→添加删除应用程序”菜单项,在出现的“软件包管理”对话框里确保选中“FTP服务器”选项,然后单击“更新”按钮,按照屏幕提示插入第3张安装光盘即可开始安装。

  另外,你也可以直接插入第3张安装光盘,定位到/RedHat/RPMS下的vsftpd-1.1.3-8.i386.rpm安装包,然后在终端命令窗口运行以下命令即可开始安装进程:

  [root@ahpeng RPMS] rpm -ivh vsftpd-1.1.3-8.i386.rpm

  2.启动/重新启动/停止vsftpd服务
  从Red Hat Linux 9.0开始,vsftpd默认只采用standalone方式启动vsftpd服务,方法是在终端命令窗口运行以下命令:

  [root@ahpeng root] /etc/rc.d/init.d/vsftpd start

  重新启动vsftpd服务:

  [root@ahpeng root] /etc/rc.d/init.d/ vsftpd restart

  关闭vsftpd服务:

  [root@ahpeng root] /etc/rc.d/init.d/ vsftpd stop

  确认vsftpd服务已经启动后,我们可以在任意一台Windows主机的DOS命令窗口里输入“ftp FTPAddres”(用实际的FTP服务器IP地址或者域名代替FTPAddres),注意用户名、密码都是ftp(ftp是匿名用户的映射用户账号),如下所述:

  Microsoft Windows XP [版本 5.1.2600]

  (C) 版权所有 1985-2001 Microsoft Corp.

  F:\Peter>ftp FTPAddress

  Connected to FTPAddress

  220 (vsFTPd 1.1.3)   //vsftpd的响应请求

  User (FTPAddress:(none)): ftp  //输入用户账号ftp

  331 Please specify the password.

  Password:  //输入密码ftp

  230 Login successful. Have fun.

  ftp>

  3.vsftpd的配置
  在Red Hat Linux 9.0里的vsftpd共有3个配置文件,它们分别是:

  vsftpd.ftpusers:位于/etc目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。

  vsftpd.user_list:位于/etc目录下。该文件里的用户账户在默认情况下也不能访问FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。

  vsftpd.conf:位于/etc/vsftpd目录下。它是一个文本文件,我们可以用Kate、Vi等文本编辑工具对它进行修改,以此来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。

  (1)用户登录控制

  anonymous_enable=YES,允许匿名用户登录。

  no_anon_password=YES,匿名用户登录时不需要输入密码。

  local_enable=YES,允许本地用户登录。

  deny_email_enable=YES,可以创建一个文件保存某些匿名电子邮件的黑名单,以防止这些人使用Dos攻击。

  banned_email_file=/etc/vsftpd.banned_emails,当启用deny_email_enable功能时,所需的电子邮件黑名单保存路径(默认为/etc/vsftpd.banned_emails)。

  (2)用户权限控制

  write_enable=YES,开启全局上传权限。

  local_umask=022,本地用户的上传文件的umask设为022(系统默认是077,一般都可以改为022)。

  anon_upload_enable=YES,允许匿名用户具有上传权限,很明显,必须启用write_enable=YES,才可以使用此项。同时我们还必须建立一个允许ftp用户可以读写的目录(前面说过,ftp是匿名用户的映射用户账号)。

  anon_mkdir_write_enable=YES,允许匿名用户有创建目录的权利。

  chown_uploads=YES,启用此项,匿名上传文件的属主用户将改为别的用户账户,注意,这里建议不要指定root账号为匿名上传文件的属主用户!

  chown_username=whoever,当启用chown_uploads=YES时,所指定的属主用户账号,此处的whoever自然要用合适的用户账号来代替。

  chroot_list_enable=YES,可以用一个列表限定哪些本地用户只能在自己目录下活动,如果chroot_local_user=YES,那么这个列表里指定的用户是不受限制的。

  chroot_list_file=/etc/vsftpd.chroot_list,如果chroot_local_user=YES,则指定该列表(chroot_local_user)的保存路径(默认是/etc/vsftpd.chroot_list)。

  nopriv_user=ftpsecure,指定一个安全用户账号,让FTP服务器用作完全隔离和没有特权的独立用户。这是vsftpd系统推荐选项。

  async_abor_enable=YES,强烈建议不要启用该选项,否则将可能导致出错!

  ascii_upload_enable=YES;ascii_download_enable=YES,默认情况下服务器会假装接受ASCⅡ模式请求但实际上是忽略这样的请求,启用上述的两个选项可以让服务器真正实现ASCⅡ模式的传输。

  注意:启用ascii_download_enable选项会让恶意远程用户们在ASCⅡ模式下用“SIZE/big/file”这样的指令大量消耗FTP服务器的I/O资源。

  这些ASCⅡ模式的设置选项分成上传和下载两个,这样我们就可以允许ASCⅡ模式的上传(可以防止上传脚本等恶意文件而导致崩溃),而不会遭受拒绝服务攻击的危险。

  (3)用户连接和超时选项

  idle_session_timeout=600,可以设定默认的空闲超时时间,用户超过这段时间不动作将被服务器踢出。

  data_connection_timeout=120,设定默认的数据连接超时时间。

  (4)服务器日志和欢迎信息

  dirmessage_enable=YES,允许为目录配置显示信息,显示每个目录下面的message_file文件的内容。

  ftpd_banner=Welcome to blah FTP service,可以自定义FTP用户登录到服务器所看到的欢迎信息。

  xferlog_enable=YES,启用记录上传/下载活动日志功能。

  xferlog_file=/var/log/vsftpd.log,可以自定义日志文件的保存路径和文件名,默认是/var/log/vsftpd.log。

——————————————————————————–
lsw 回复于:2004-02-18 12:05:11
四、架设邮件服务器
  邮件服务器是一个网站所必须的服务,在这里我们可以通过Red Hat Linux 9.0自带的Sendmail来架设邮局服务器。

  1.安装Sendmail
  如果是完全安装Red Hat Linux 9.0,那么系统已经内置有Sendmail 8.12.8-4服务器。如果不能确定是否已经安装sendmail,可以在终端命令窗口输入如下命令:

  [root@ahpeng root] rpm -qa | grep sendmail

  如果结果显示为“sendmail-8.12.8-4”,则说明系统已经安装sendmail服务器。如果安装Red Hat Linux 9.0时没有选择Sendmail服务器,则可以在图形环境下单击“主菜单→系统设置→添加删除应用程序”菜单项,在打开的“软件包管理”对话框中确保选中“邮件服务器”选项,然后单击“更新”按钮,按照屏幕提示插入第一张安装光盘即可开始安装。

  另外,你也可以直接插入第1张安装光盘,定位到/RedHat/RPMS目录下的sendmail-8.12.8-4.i386.rpm安装包,然后在终端命令窗口运行以下命令即可开始安装进程:

  [root@ahpeng RPMS] # rpm -ivh sendmail-8.12.8-4.i386.rpm

  用类似的方法安装sendmail-cf.8.12.8-4.i386.rpm、sendmail-doc. 8.12.8-4.i386.rpm,位于第3张安装光盘的/RedHat/RPMS目录下。

  2.启动/重新启动/停止Sendmail服务
  安装Sendmail服务器以后,最简单的启动方式是在终端命令窗口运行如下命令:

  [root@ahpeng root]/etc/rc.d/init.d/sendmail start

  应该会出现以下的结果,表明邮件服务器已经启动成功:

  启动 sendmail: [确定]

  启动 sm-client:[确定]

  除以上方式,我们还可以使用带参数的Sendmail命令控制邮件服务器的运行,例如:

  [root@ahpeng root]# sendmail -bd -q1h

  Sendmail的命令参数的含义如下:

  -b:指定Sendmail在后台运行,并且监听端口25的请求。

  -d:指定Sendmail以Daemon方式运行(守护进程)。

  -q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。例子里的1h表示保留1小时。

  在终端命令窗口运行以下命令来重新启动Sendmail服务:

  [root@ahpeng root]#/etc/rc.d/init.d/sendmail restart

  在终端命令窗口运行以下命令来关闭Sendmail服务:

  [root@ahpeng root]#/etc/rc.d/init.d/sendmail stop

  我们还可以在终端命令窗口运行以下命令来检测Sendmail服务器的运行状态:

  [root@ahpeng root]# /etc/rc.d/init.d/sendmail status

  系统应该显示:

  sendmail (pid 3251) 正在运行…

  3.配置Sendmail
  Sendmail的配置十分复杂。它的配置文件是sendmail.cf,位于/etc/mail目录下。由于sendmail.cf的语法深奥难懂,很少有人会直接去修改该文件来对Sendmail服务器进行配置。我们一般通过m4宏处理程序来生成所需的sendmail.cf文件。创建的过程中还需要一个模板文件,系统默认在/etc/mail目录下有一个sendmail.mc模板文件。

  我们可以根据简单、直观的sendmail.mc模板来生成sendmail.cf文件,而无需直接编辑sendmail.cf文件。可以直接通过修改sendmail.mc模板来达到定制sendmail.cf文件的目的。这里介绍创建sendmail.cf文件的步骤:

  (1)备份原有sendmail.cf文件

  在终端命令窗口运行以下命令:

  cp /etc/mial/sendmail.cf /etc/mail/sendmail.cf.BAK

  (2)生成sendmail.cf文件

  根据sendmail.mc模板文件产生sendmail.cf配置文件,并导出到/etc/mail/目录下:

  m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

  (3)重启sendmail服务

  [root@ahpeng root] /etc/rc.d/init.d/sendmail restart

  很显然,用m4宏编译工具创建sendmail.cf文件比较方便,而且不容易出错,更可以避免某些带有安全漏洞或者过时的宏所造成的破坏。一个sendmail.mc模板的大致内容如下:

  divert(-1)dnl

  ……

  include(‘/usr/share/sendmail-cf/m4/cf.m4′)dnl

  VERSIONID(’setup for Red Hat Linux’)dnl

  OSTYPE(‘linux’)dnl

  ……

  dnl #

  dnl define(‘SMART_HOST’,’smtp.your.provider’)

  dnl #

  define(‘confDEF_USER_ID’,”8:12”)dnl

  define(‘confTRUSTED_USER’, ’smmsp’)dnl

  dnl define(′confAUTO_REBUILD′)dnl

  ……

  这里介绍sendmail.mc模板的语法组成:

  dnl:用来注释各项,同时dnl命令还用来标识一个命令的结束。

  divert(-1):位于mc模板文件的顶部,目的是让m4程序输出时更加精简一些。

  OSTYPE (‘OperationSystemType’):定义使用的操作系统类型,显然这里应该用linux代替OperationSystemType,注意要用一个反引号和一个正引号把对应的操作系统类型括起来。

  define:定义一些全局设置,对于Linux系统,设置了OSTYPE之后,可以定义下面的一些全局参数,如果不定义,就使用默认值。这里举两个简单例子:define(‘ALIAS_FILE’,’/etc/aliases’)

  定义别名文件(alia file)的保存路径,默认是/etc/aliases

  define(‘STATUS_FILE’, ‘/etc/mail/statistics’)

  sendmail的状态信息文件。

  以上只是sendmai.mc的一些简单的语法解释,更多的参数含义及其配置信息可以参见http://www.sendmail.org/m4/tweaking_config.html。

  4.为新用户开电子邮件账号
  在Linux里为新用户开设电子邮件账户比较简单,只需在Linux系统里新增一个用户即可。单击“主菜单→系统设置→用户和组群”菜单项,打开“Red Hat用户管理器”对话框,单击“添加用户”按钮,在出现的“创建新用户”对话框里指定用户名、登录口令即可,如图3所示。

  假设我们添加了一个用户Peter(密码为peter),这样该用户就有了一个邮件地址Peter@YourDomain.com(此处的YourDomain.com用你自己域名代替)。

  以上过程也可以在终端命令窗口运行以下命令来实现:

  [root@ahpeng root]#adduser peter -p peter

  5.为电子邮件账户设置别名
  有一些用户想使用多个电子邮件地址,是不是需要创建多个邮件账号呢?我们可以使用别名(alias)来解决这个问题。

  比如说,用户peter想拥有以下3个电子邮件地址:

  peter@YourDomain.com、dearpeter@ YourDomain.com、truepeter@ YourDomain.com。

  我们可以通过以下步骤来实现这样的别名设置:

  新增一个账号peter;然后用vi、或者Kate等文本编辑器打开/etc/aliases,在里面加上两行:

  dearpeter: peter

  truepeter: peter

  保存该/etc/aliases退出。

  不过,就这样还不能让Sendmail接受新增的别名,我们必须在终端命令窗口运行newaliases命令,以要求Sendmail重新读取/etc/aliases文件。如果一切无误,应该可以看到类似以下的回应消息:

  [root@ahpeng root]# newaliases

  /etc/aliases: 63 aliases, longest 10 bytes, 625 bytes total

  这样,发给peter的邮件可以使用3个邮件地址,而peter只需要使用一个电子邮件账号peter@YourDomain.com就可以接收所有寄给以上3个地址的电子邮件。

  6.指定邮箱容量限制
  当一个邮件服务器为许多人提供邮件服务时,无限量的电子邮件将很容易塞满服务器的硬盘,造成硬盘负担。如果不想为用户提供无限空间的邮件暂存空间,可以使用“邮件限额”来给用户一个有限的暂存空间。

  其实,它是利用磁盘配额功能来实现的。电子邮件的暂存空间是在/var/spool/mail目录下,只要通过磁盘配额设定每一个用户在这个目录下能使用的最大空间即可。

  7.支持POP和IMAP功能
  到现在为止,我们已经可以用Outlook Express发送邮件,或者登录服务器使用mail、pine命令收取、管理邮件。但是还不能用Outlook Express等客户端从服务器下载邮件,这是因为Sendmail并不具备POP3(IMAP)的功能,所以我们必须自己安装。

  (1)POP和IMAP服务器安装

  安装Red Hat Linux 9.0时,可以选择安装POP和IMAP服务器,可以在终端命令窗口运行以下命令进行验证:

  [root@ahpeng root]# rpm -qa imap

  imap-2001a-18

  如果没有安装,可以将第2张安装光盘放进光驱,然后在终端命令窗口运行以下命令即可开始安装:

  [root@ahpeng root]#cd /mnt/cdrom/RedHat/RPMS

  [root@ahpeng root]#rpm -ivh imap-2001a-18.i386.rpm

  由于Red Hat Linux 9.0已经将POP和IMAP打包成一个单独的套件,安装好imap-2001a-18.i386.rpm,就会同时安装这两个服务器

  (2)启动POP和IMAP服务

  要成功启动POP和IMAP服务器,首先要确定这些服务存在于/etc/services文件,确保以下的服务前面没有加上#注释(如果有,必须去除注释)。

  imap  143/tcp imap2  # Interim Mail Access Proto v2

  imap  143/udp imap2

  pop2  109/tcp pop-2  postoffice # POP version 2

  pop2  109/udp pop-2

  pop3  110/tcp pop-3  # POP version 3

  pop3  110/udp pop-3

  修改好/etc/services文件,接下来就要对相应服务配置文件进行定制:

  启动POP3服务:必须修改/etc/xinetd.d/ipop3文件,将其中的“disable=yes”改为“disable=no”,保存该文件。最后必须重新启动xinetd程序来读取新的配置文件,使得设定内容生效:

  [root@ahpeng root]#/etc/rc.d/init.d/xinetd reload

  启动IMAP服务:必须修改/etc/xinetd.d/imap文件,将其中的“disable = yes”改为“disable =no”,保存该文件。最后必须重新启动xinetd程序来读取新的配置文件,使得设定内容生效:

  [root@ahpeng root]#/etc/rc.d/init.d/xinetd reload

  设置好以后,就可以在Outlook Express里面设置好邮件账号,以后就可以直接利用Sendmail服务器进行收发邮件了,由于邮件服务器就在本地局域网,所以速度很快。

——————————————————————————–
lsw 回复于:2004-02-18 12:05:42
五、Linux下的网络邻居Samba
  Windows可以通过网络邻居访问局域网主机,而在Linux下可以通过Samba客户端访问局域网内的Windows主机,也可以通过Samba服务器给Windows主机提供文件、打印机服务。为了方便讲述,这里假设Windows主机的计算机名为Peter,设Linux主机的名称为RedHat。

  1.安装Samba组件
  如果选择完全安装Red Hat Linux 9.0,则系统会默认安装Samba组件。我们可以在终端命令窗口输入以下命令进行验证:

  [root@ahpeng root] rpm -qa | grep samba

  如果结果出现以下所示的5个软件包,则表示已经安装:

  samba-swat-2.2.7a-7.9.0

  samba-2.2.7a-7.9.0

  redhat-config-samba-1.0.4-1

  samba-common-2.2.7a-7.9.0

  samba-client-2.2.7a-7.9.0

  如果没有安装过Samba软件包,则可以插入第1张安装光盘,然后鼠标依次单击“主菜单→系统设置→添加/删除应用程序”菜单项,打开“软件包管理”对话框,在该对话框中找到“Windows文件服务器”选项,确保该选项处于选中状态,然后单击“更新”按钮即可开始安装。

  你也可以把第1张安装光盘插入光驱,然后在终端命令窗口输入以下命令:

  [root@ahpeng root]# cd /mnt/cdrom/RedHat/RPMS

  [root@ahpeng RPMS]# rpm -ivh samba*

  [root@ahpeng RPMS]# rpm -ivh redhat-config-samba-1.0.4-1.noarch.rpm

  2.Linux主机访问Windows主机
  安装好Samba之后,就有了与Windows互相访问的基础。这里先介绍一下如何用字符命令方式访问Windows宿主机的共享资源。

  (1)查询宿主机的共享资源

  可以使用“smbclient –L WindowsHostName”命令(此处的WindowsHostName用Windows主机名代替)。本例是要查询Windows主机Peter上的共享资源,可以在终端窗口输入“smbclient –L Peter”命令,然后回车即可看到Windows主机的共享资源。

  (2)连接宿主机的共享目录

  可以使用“smbclient //WindowsHostName/ShareName”命令来连接Windows主机上的某个共享文件夹,如果该共享文件夹需要用户名和密码,则可以使用“smbclient //WindowsHostName/ShareName –U UserName”命令。例如要连接Windows主机Peter上的共享目录Share,我们可以在终端窗口输入“smbclient //Peter/Share”命令然后回车即可。

  如果连接成功,即可出现“smb:\>”提示符,在该命令提示符下输入适当的命令,即可对所连接的共享目录进行操作。

  Smb支持的命令有大约40个命令,可以很方便地对共享目录进行删除、重命名、切换目录等操作。如果要列出共享目录“Share”下的具体内容,可以使用ls命令。要删除其下的test.txt文件,可以使用“del test.txt”命令。

  (3)映射网络驱动器

  我们知道,Windows下可以将共享目录映射为网络驱动器,这样就可以把共享目录当成本地文件夹来使用。在Linux下可以借助于smbmount命令来实现,具体的命令参数是“smbmount //WindowsHostName/ShareName /mnt/smbdir”(此处的ShareName指代Windows共享资源名称,smbdir指代挂载点名称)。假设要将Windows主机Peter下的共享文件夹Share映射为/mnt/WinShare目录,具体步骤是:

  首先在/mnt目录下创建一个目录,假设为/mnt/WinShare;

  然后打开终端命令窗口,运行“smbmount //Peter/Share /mnt/WinShare”即可;

  现在再在文件管理器里打开/mnt/WinShare目录可以看到共享目录的内容!要卸载该映射目录,可以使用umount命令。

  (4)用Nautilus访问Windows主机

  借助Gnome桌面下的文件管理器Nautilus,我们可以用图形界面来访问Windows主机,这里要注意的是Nautilus只是提供访问Windows主机的图形界面,具体的底层操作还是借助于Samba客户端来完成。

  在Gnome桌面环境下,单击“主菜单→网络服务器”菜单项,即可用Nautilus文件管理器查看工作组列表。双击工作组名称,即可看到其下的Windows主机。

   双击其中的某台Windows主机图标,即可看到该主机的共享文件夹,可以看到这和Windows下的网络邻居几乎一样。

  由于Nautilus本身就是Red Hat Linux的文件管理器,所以我们可以任意往Windows共享目录里拷贝文件、删除文件、创建目录等等(对于Windows 2000/XP主机还需要考虑该共享资源的权限设置)。

  3.Windows主机访问Linux主机
  要想让Windows宿主机能够访问Linux虚拟机,就必须在Linux虚拟机上启动Samba服务。在启动之前,还需要对Samba服务的属性进行配置,例如指定Linux虚拟机的共享目录、所在的工作组名称等。

  (1)配置Samba服务器

  在以前版本的Red Hat Linux,我们必须直接修改Samba配置文件smb.conf,或者使用SWAT对Samba进行全方位的设置。Red Hat Linux 9.0新引入了一个图形化的Samba服务器配置工具,可以让我们很方便地对Samba服务器进行配置。以root用户身份登录系统,单击“主菜单→系统设置→服务器设置→Samba服务器”菜单项,即可打开Samba服务器配置对话框。也可以在终端命令窗口输入“redhat-config-samba”,来访问Samba服务器配置对话框。

  首先对Samba服务器的基本设置和安全选项进行配置,单击配置对话框上的“首选项→服务器设置”菜单项,即可打开服务器设置对话框。

  基本设置:在对话框的“基本”标签页,我们可以指定Linux主机所在的工作组名称,需要注意的是,此处的工作组名称不一定非得与Windows主机所在的工作组名称一致。

  安全设置:然后进行Samba服务器安全设置,这里一共有4个选项。

  “验证模式”代表如果Windows主机不是位于NT域里,此处应该选择“共享”验证模式,这样只有在连接Samba服务器上的指定共享时才要求输入用户名、密码;“验证服务器”代表对于“共享”验证模式,无需启用此项设置;“加密口令”选项应该选择“是”,这样可以防止黑客用嗅探器截获密码明文;“来宾账号”代表当来宾用户要登录入 Samba 服务器时,他们必须被映射到服务器上的某个有效用户。选择系统上的现存用户名之一作为来宾Samba账号。当用户使用来宾账号登录入 Samba 服务器,他们拥有和这个用户相同的特权。

  添加共享目录:单击Samba配置对话框工具栏上的“增加”按钮。在打开的对话框中的“基本”标签页上,指定(共享)目录为某个存在的目录,例如可以指定/tmp,再指定该目录的基本权限是只读还是读/写。在“访问”标签页上,可以指定允许所有用户访问、或者只允许某些用户访问。

  (2)启动Samba服务器

  打开终端命令窗口,输入“/sbin/service smb start”命令,即可出现以下提示信息,表示Samba服务已经启动。

  # /sbin/service smb start

  启动SMB 服务 [确定]

  启动NMB 服务 [确定]

  接下来在Windows里打开“网络邻居”,就可以看到我们刚才设置的Samba服务器了!

以前在WINDOWS里面习惯在同一个分区中放同类文件。比如,我的文档和下载的软件。

今天查了资料,在LINUX也实现了这样的功能了。把以前的LINUX系统的/home目录所在分区挂装到当前系统的/home上去

我的系统为RedHat9.0,以前/home所在分区名为hda10,分区格式ext3

打开文件/etc/fstab
在最后添加。

添加后我的fstab如下,最后一行是我添加的,前面的是我系统原有的。

LABEL=/                /                             ext3                defaults                               1 1
LABEL=/boot        /boot                     ext3                defaults                               1 2
none                      /dev/pts                devpts            gid=5,mode=620              0 0
none                      /proc                     proc                defaults                               0 0
none                      /dev/shm             tmpfs              defaults                               0 0
/dev/hda11           swap                    swap              defaults                               0 0
/dev/cdrom           /mnt/cdrom          udf,iso9660  noauto,owner,kudzu,ro    0 0
/dev/cdrom1         /mnt/cdrom1       udf,iso9660  noauto,owner,kudzu,ro    0 0
/dev/hda10           /home                   ext3                defaults                               1 3

                                                                                                                            2005年05月01日 8:12 PM

首先到www.fcitx.org下载fctix的最新版本。这里我使用的3.1.1。

LINUX系统为Redhat9.0,压缩包名为fcitx-3.1.1.tar.bz2,存放在/home/heyuqi/Downloads/Entering。

首先要解压,可以直接在资源管理器里点击,会跳出与winzip很象的ark程序,解压到用户目录下(因为其他地方你没有权限),比如,解压到 /home/heyuqi/Applications目录下。如果没有装ark程序,那可以用命令来解压。打开一个终端(比如说xterm,konsole都可以),进到你下载的文件所在目录,比如是/home/heyuqi/Applications,运行命令:
            tar jxvf /home/heyuqi/Downloads/Entering/fcitx-3.1.1.tar.bz2
现在文件已经解压在/home/heyuqi/Applications/fcitx-3.1.1目录下,进入这个目录。

然后取得root权限:
            su
<输入root的密码>

再输入编译命令:
            make

安装:
            make install

这样fcitx基本安装完了,如果中间有出错的,请查看http://www.linuxsir.com/bbs/showthread.php?s=bc45c554defdf9ce718c594e2d49833b&t=37665&page=1&pp=15,这里有比较详细的解释。

最后我们还需要配置一下系统。

1.  你的用户目录下,找到.bashrc文件(是隐藏文件,所以前面有一个“.”),在这个文件最后面加上:
            export XMODIFIERS=@im=fcitx
            fcitx
   前一句是用来设置XMODIFIERS变量的的,后一句用来启动fcitx,这样fcitx就可以实现自启动了。

2.  然后注销当前用户,用root进入系统。修改/etc/X11/xinit/xinitrc.d/xinput文件。
    用Find查找一下
            XIM="none"
    只有一个, 修改为
             XIM="none"
             if [ -e /usr/bin/chinput ]; then
                    XIM="Chinput"
             elif [ -e /usr/X11R6/bin/xcin ]; then
                   export LC_CTYPE=zh_CN.GB2312
                   XIM="xcin-zh_CN.GB2312"
             fi
   然后修改/etc/gtk-2.0/gtk.immodules,将
             "xim" "X Input Method" "gtk+" "/usr/share/locale" "ko:ja:zh"
   修改为
             "xim" "X Input Method" "gtk+" "/usr/share/locale" "en:ko:ja:zh"


这时全部工作都完成了,我们可以在英文LINUX里输入中文了

                                                                                                                     2005年05月01日 9:23 PM

你的类需要一个构造函数吗?

你的成员变量是私有的吗?

  如果类设计者使用的是一个成员变量,那么设计者必须保证这个成员变量在任何时候都能够正确反映实际数量的数值,因为没有办法知道类的使用者什么时候会来访问这个信息。

你的类需要一个无参的构造函数吗?

  如果你想声明该类的对象可以不必显式地初始化它们,则必须显式地写一个无参的构造函数。

是不是每个构造函数都初始化所有的数据成员?

        一般来说,每个构造函数都要为所有的数据成员设置经过明确定义的值。如果没有做这一点,就很可能导致错误。当然,不一定是这样的,类会有一些数据成员只在它们的对象存在了一定时间之后才有意义。

你的类需要析构函数吗?

        如果该类分配了资源,但这些资源不会由成员函数自动释放。就需要析构函数。

你的类需要一个虚析构函数吗?

        声明一个派生类的对象的同时也自动声明了一个基类的对象。派生类的对象也可以认为是其基类的对象,但是反之不然。因此,C++允许一个基类对象的指针指向其派生类的对象(派生类包含基类的成员函数),但不允许一个派生类对象的指针指向其基类的对象(基类不一定包含派生类的成员函数)。

        所以,当基类和派生类都有相同的成员函数时,基类指针无论是指向基类对象还是指向派生类对象,调用的都是基类的成员函数。(当然派生类指针指向派生类对象,调用的是派生类的成员函数)

        下面有一例,说明这个问题:

        #include <iostream.h>

        class A{

        public:

                 //虚函数第一次在基类中定义时,不能省略关键字virtual

                virtual void show(){cout<<”A::show\n”};

        };

        class B: public A{

        public:

                void show(){cout<<”B::show\n”};

        };

        void main() {

               A  a,*pa;

               B  b;

               pa = &a; pa->show();

               pa = &b; pa->how();

         }

    程序运行结果为:

                A::show

                B::show

        如果类A的成员函数show()不是虚函数,程序运行的结果应为:

                A::show

                A::show

        另外这样的程序是非法的:

                A  a;

                B  b, *pb;

                pb = (B *)&a;

                pb->show();

        这样的程序可能能运行(因为我没试过),但是这是一个很不好的习惯。如果基类A中没有成员函数show(),程序运行后会出现异常情况。这是因为程序把基类指针&a强制转化为派生类指针pb,然后通过pb引用对象 a中并不存在的派生类成员show()

你的类需要复制构造函数吗?

    关键在于复制该类的对象是否就相当于复制其数据成员和基类对象。如果不相当,就需要复制构造函数。如

    int  x=0,y=1;

        x = y;

就是类似的复制类对象的情况

        如果不想用户能够复制类的对象,就声明复制构造函数(可能还有赋值操作符)为私有的:

        class Thing {

        public:

              //…

       

        private:

              Thing (const Thing&);

              Thing& operator= {const Thing&};

        };    

你的类需要一个赋值操作符吗?

        如果需要复制构造函数,同理多半也会需要一个赋值操作符。如果不想用户能够设置类中的对象,就将赋值操作符私有化。类X的赋值由X::operator=来定义。通常,operator=应该返回一个X&,并且由

        return * this;

结束以保证与内建的复制操作符一致。 

你的赋仁操作符能正确地将对象赋给对象本身吗?

        有可能在还没有实施复制之前就把原对象销毁了。例如:

         class String{

         public:

               string&operator={const string& s};

         private:

               char*data;

         }

          //很明显但不正确的实现

         String& string::operator={const String& s}

         {

               delete [] data;

               data = new char[strlen{s.data}+1];

               strcpy {data, s.data};

               return *this;

         }

         //正确的实现方法1

         String& string::operator={const String& s}

         {

              if  (&s != this)  {

                   delete [] data;

                   data = new char[strlen{s.data}+1];

                   strcpy {data, s.data};

              }

              return *this;

         }

         //正确的实现方法2

         String& string::operator={const String& s}

         {

              char* newdata = new char[strlen(s.data +1)];

              strcpy {newdata, s.data};

              delete [] data;

              data = newdata;

               return *this;

         }

你的类需要定义关系操作符吗?

        如果你的类逻辑上支持相等操作,那么提供operator==operator!=就可能会很有好处。类似地,如果你的类的值有某种排序关系,那就可能会想提供余下的关系操作符。即使不希望用户直接使用关系符,也可能需要这些关系操作符。只要它们想创建你的类型的有序集合,你就必须提供关系操作符。

删除数组时你记住了用delete[]吗?

  

记得在复制构造函数和赋值操作符的参数类型中加上const了吗?

        复制构造函数应该是X::X(const X&)。实际上,由于绑定一个非const引用到一个临时的对象是非法的,使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果。同样的道理也适用于赋值:使用X::operator=(const X&),而不是X::operator=(X&)

 

如果函数有引用参数,它们应该是const引用吗?

        只有当函数想改变参数时,它才应该有不用const声明的引用参数。

记得适当地声明成员函数为const的了吗?

        如果确信一个成员函数不用修改它的对象,就可以声明它为const,这样就把它用于const对象了。例如:

        template<class T> class Vactor  {

        public:

              int length() const;       //得到长度,int length();是错误

              int length(int);          //设置长度,返回前一个

              // …

        }

否则,我们会遇到类似下面的问题:

       template<class T>

       int padded_length(const Vector<T>& v, int n)      {

              int k = v.length();             //oops!

              return k>n?k:n;

      }

        除非对length的声明中出现了前面所说的const,否则标注了oops!的行将不会编译,因为vconst引用。

                                              2005年3月13日

From:None
Author:Anonymous

1.把C++当成一门新的语言学习(和C没啥关系!真的。);

2.看《Thinking In C++》,不要看《C++变成死相》;

3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;

4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;

5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;

6.会用Visual C++,并不说明你会C++;

7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;

8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;

9.看Visual C++的书,是学不了C++语言的;

10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?

11.浮躁的人容易问:我到底该学什么;——别问,学就对了;

12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;

13.浮躁的人容易说:我要中文版!我英文不行*—不行?学呀!

14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;

15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;

16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;

17.C++不仅仅是支持面向对象的程序设计语言;

18.学习编程最好的方法之一就是阅读源代码;

19.在任何时刻都不要认为自己手中的书已经足够了;

20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;

21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;

22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;

23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;

25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;

26.请看《程序设计实践》,并严格的按照其要求去做;

27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;

28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;

29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;

30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;

31.学习编程的秘诀是:编程,编程,再编程;

32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;

33.记住:面向对象技术不只是C++专有的;

34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;

35.把在书中看到的有意义的例子扩充;

36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;

37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;

38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;

39.C++语言和C++的集成开发环境要同时学习和掌握;

40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;

41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;

42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);

43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;

44.决不要因为程序“很斜就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;

45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;

46.记录下在和别人交流时发现的自己忽视或不理解的知识点;

47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;

48.保存好你写过的所有的程序——那是你最好的积累之一;

49.请不要做浮躁的人;

50.请热爱C++!