---海轩--- 的个人资料海轩照片日志列表 工具 帮助

海轩

没有相册。
尚未添加列表。
2006/2/24

开始→运行→输入的命令集锦(转)

 

winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天
mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令
dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器
net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕“讲述人”
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口
syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护
tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器
packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器
regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序
osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令
iexpress-------木马捆绑工具,系统自带
Nslookup-------IP地址侦测器
fsmgmt.msc-----共享文件夹管理器
utilman--------辅助工具管理器
sndrec32-------录音机
Nslookup-------IP地址侦测器   
explorer-------打开资源管理器
logoff---------注销命令     
tsshutdn-------60秒倒计时关机命令
lusrmgr.msc----本机用户和组   
services.msc---本地服务设置
oobe/msoobe /a----检查XP是否激活               
notepad--------打开记事本
cleanmgr-------垃圾整理     net
start messenger----开始信使服务
compmgmt.msc---计算机管理   net
stop messenger-----停止信使服务
conf-----------启动netmeeting
dvdplay--------DVD播放器
charmap--------启动字符映射表
diskmgmt.msc---磁盘管理实用程序
calc-----------启动计算器   
dfrg.msc-------磁盘碎片整理程序
chkdsk.exe-----Chkdsk磁盘检查
devmgmt.msc--- 设备管理器
regsvr32 /u *.dll----停止dll文件运行            
drwtsn32------ 系统医生   
regedt32-------注册表编辑器   
Msconfig.exe---系统配置实用程序
rsop.msc-------组策略结果集   
mem.exe--------显示内存使用情况
regedit.exe----注册表      
winchat--------XP自带局域网聊天
progman--------程序管理器   
winmsd---------系统信息
perfmon.msc----计算机性能监测程序               
winver---------检查Windows版本
sfc /scannow-----扫描错误并复原
taskmgr-----任务管理器

MSDN使用(转)

 

如果你做程序,就不能不用到文档,如果你在WIN32下面做程序的,就不能不用到MSDN了。
MSDN是微软提供给广大程序员的开发大全,里面有很多值得我们利用的地方,有人问道怎么用,我这里介绍一下:
首先我说明一下MSDN的结构,MSDN一般是三张光盘(也有DVD的,内容更丰富),分季度发行(月份-年份的格式),在安装时最好全装(1。5G左右),这样可以免去换盘之苦。里面依次有如下内容(以July 2001版本为例):
(以下内容可能跨越了很多类,但是基本按MSDN顺序)
1。更新说明和更多的浏览信息(就是首页和Welcome了)
2。.NET的文档
3。Visual Studio的帮助库
4。Office开发者文档
5。嵌入设备开发者文档
6。平台SDK开发文档
7。其他文档(例如新加入的XML&SOAP开发包,Passport开发包,Project2000等等)
8。Windows系列资源包的开发文档(每个平台特性说明和独有特性API说明)
9。知识库
10。技术文章
11。背景知识
12。规格书(或者叫白皮书)
13。有价值的书(比如MSPress的好多书,还有经典的书籍的节选)
14。杂志节选
15。示例
MSDN的结构就是这样了,我接下来想详细说明的是第2。3。6。7。11。13。15。,其他的简单介绍。为简单起见,就用代号表示具体名字了。

1。这一部分,你可以了解MSDN最新的信息,错误的报告,MS最新的发展动态,更多的信息的访问地址(当然还有怎么订阅MSDN光盘,不过我们好像不用了,我们找中关村小贩吧)。

4。在做Office扩展开发时,比如vba时,这可以查找office提供了怎样的com对象供使用,当然里面也有很多office教材和疑难解答,但是e文我想我们用不到了(不过写书的朋友可以参考哦)。

5。这一部分其实是将eVC和eVB这两个MS嵌入式开发工具的帮助结合到整个MSDN中来的,原有的文档这里都能找到,因此作WinCE下开发的同志们注意了(以前我做WinCE开发时可是这部分的常客)。

8。这一部分是各个Windows平台的特性说明,包括涉及的API,做跨平台可以参考,但是基本用不上的。

9。这里的文章以QXXXXX编号,是MSDN网站上面的问答集合,里面其实有很多有价值得信息,但是无奈没有标题,只能依靠搜索和文档部分的“See QXXXXX”来看了,里面有一些很重要的文章,以前我收集过,但是格盘弄掉了,残念。。。

10。技术文章这一块阐述了一些开发模式和性能优化的建议,分门别类列举了实现特定目的地一般模式和组织方法,如果计划开发大型项目可以参考。

12。这里其实是白皮书大集合,里面有各种各样的规范。

14。这里的文章出自最近的MSDN等杂志,只是没有整理如规范文档而已。

接下来就是具体介绍了,大家有点耐心些:

2。。net文档
做为微软的旗舰产品,。net来势汹汹,这里集合了所有的文档,包括了。net的规范,配置方法,api说明,入门材料等等,可以说内容十分丰富,学习。net在没有很好资料的情况,这里就是最好的材料了。我重点介绍几个部分:
Inside the .NET Framework -- 这里面介绍了.net的关键概念,运行机制和涉及理念等等,了解.net就从这里开始了;
Building .NET Framework Applications,Debugging, Optimizing, and Profiling,Configuring .NET Framework Applications -- 编写建立,调试优化配置,安置.net环境,包括了整个过程;
.NET Framework Class Library -- 前一部分的金山词霸翻译版就是市面上什么“.net开发手册”的书的来源,现在知道来源了吧,为什么不用原味的资料,而要去买书呢?;
.NET Framework Tools -- 这个一般的书都不介绍,但是非常重要,.net提供的Tools的使用说明;
.NET Framework Configuration File Schema -- .net的配置文件的格式和说明;
.NET Framework Samples -- .net例子;
这就是.net部分介绍,是不是突然发现原来资料就在你身边,自己却不知道?

3。Visual Studio的帮助库
这一部分的内容估计是大家都很关心的,因为涉及到了很多的VS的内容(VC,VB用户强烈渴望^_^)。展开这个节点我们可以看到Visual Studio Document,Visual C++ Document,Visual Basic Document等等激动人心的内容,这就是VS6以前分别集成到每个软件中的文档集合,在这里一网打尽了。我重点介绍Visual C++ Document,Visual Basic Document两个部分,其他的部分请大家自己看吧,跟这两个类似。
Visual C++ Document:
1。Visual C++ Documentation Map -- 这里有这个部分大话题的索引,你可以轻松找到使用VC,调试VC,编程手册,ATL,MFC,STL库,C++语法和标准,ODBC,RunTime等等地快速索引;
2。What's new in Visual C++ 6.0 --这里介绍了VC6的新特性,新的库等等,以后就是What's new in VC7了^_^;
3。Getting started with Visual C++ 6.0 -- 本来是新手上路的,可惜的是,现在取消了,可能ms觉得拿到这一版的都是老用户了吧;
4。Using Vsiual C++ --这里是MS自编自导的教程,详细和循序监禁的阐述了VC6的使用方法,开发模式,可谓是手把手教过来,只要E文不太滥,都可以上手的,里面包括的内容有:Visual C++ Tutorials(VC6的初级教程),Visual C++ Programmer's Guide(更加深入的编程话题),Visual C++ User's Guide(用户手册,包括了工具说明),Glossary ―― 这一部分是术语表,所有前面出现的术语在此都可以找到;
5。Reference ―― 这一部分包括了两部分:Microsoft Foundation Classes and Templates,这里面就是MFC,ATL和OLE DB模板库的使用参考了,可谓是面面俱到,非常详细,Languages and Libraries for Visual C++,这里面包括了C++语法规范的说明,还有STL库的使用手册,是不是很超值^_^
6。Samples -- 分门别类的例子程序,不愁没有实例可以参考了。
7。Compaq Alpha Documantion --这里面是Alpha处理器下面的文档,一般不用参考,给特殊人士提供的。

7。其他文档(例如新加入的XML&SOAP开发包,Passport开发包,Project2000等等)
这一部分是变化最快的内容之一,因为最近微软的新技术不断推出,很多重要开发包的文档都集中在此,像XML&SOAP ToolKit,Passport SDK等等,因此我们需要对这里有足够的重视,内容我不再罗列了,我想大家也能自己看清楚的。
经常看看这里可以发现新的方向,比如现在的XML潮流等等,就算是看不明白,也能开阔眼界,这对一个程序员只有好处没有坏处。 11。背景知识
这一部分是一些大的蓝图和规范说明,包括了很多方面,有组件对象模型,数据库和消息队列,Office应用,Web开发,Windows系列特平台的应用等等,因此在这里你可以了解到这些技术的产生提出和应用的情况,这对于每一个人都是有用的。我特别要提到的是关于Component Object Model这一部分,这里可就是COM最最原始的资料了,学习COM技术的人,最好都看看。

15。示例
这一部分其实就是全部例子的索引,遍布全部MSDN的好几百兆的例子程序,不仅为我们最原味的演绎了Windows程序的开发,而且可以从中学习与体会程序编写的技巧和规范,从此养成好的习惯,更何况里面本来就存在很多实用的程序段,稍加改造就以进入实用。所有的SAMPLES其实都在第一章光盘的samples的目录下面,完全可以将之拷贝到硬盘上来,方便以后检索。

以上就是MSDN的内容介绍了,我希望我的简单介绍能为大家好好使用它带来一点方便,具体的使用方法则需要大家来慢慢体会,接下来我最后介绍一下使用MSDN系统里面的索引(配合活动子集)和搜索功能。

索引(配合活动子集):
这是我认为MSDN里面最好用的功能之一,因为可以对索引做的非常齐全,几乎可以找到每一个地方,熟练的操作者大部分都是依靠的索引来进行检
索的,同时配合不同的活动子集,就能方便的检索各个方面的有效信息,而这一切只要你记得前面一段关键字母而已,不信你试一试CBitmap看看,是不是很好用?

搜索功能:
这一项功能自认为比较的难用,因为往往能搜索出来很多的无用信息,仅仅是因为页面里面包含了要检索的关键字而已;你可以选择按轻重缓急或者分门别类来排列,但是还是很不好找;最有用的,我想还是搜索“QXXXX”之一类的文章了。

XP命令(转)

 

winver 检查windows版本 
wmimgmt.msc 打开windows管理体系结构(wmi) 
wupdmgr windows更新程序 
wscript windows脚本宿主设置 
write 写字板 
winmsd 系统信息 
wiaacmgr 扫描仪和照相机向导 
winchat xp自带局域网聊天 
mem.exe 显示内存使用情况 
msconfig.exe 系统配置实用程序 
mplayer2 简易widnows media player 
mspaint 画图板 
mstsc 远程桌面连接 
mplayer2 媒体播放机 
magnify 放大镜实用程序 
mmc 打开控制台 
mobsync 同步命令 

dxdiag 检查directx信息 
drwtsn32 系统医生 
devmgmt.msc 设备管理器 
dfrg.msc 磁盘碎片整理程序 
diskmgmt.msc 磁盘管理实用程序 
dcomcnfg 打开系统组件服务 
ddeshare 打开dde共享设置 
dvdplay dvd播放器 

net stop messenger 停止信使服务 
net start messenger 开始信使服务 
notepad 打开记事本 
nslookup 网络管理的工具向导 
ntbackup 系统备份和还原 
narrator 屏幕“讲述人” 
ntmsmgr.msc 移动存储管理器 
ntmsoprq.msc 移动存储管理员操作请求 
netstat -an (tc)命令检查接口 

syncapp 创建一个公文包 
sysedit 系统配置编辑器 
sigverif 文件签名验证程序 
sndrec32 录音机 
shrpubw 创建共享文件夹 
secpol.msc 本地安全策略 
syskey 系统加密,一旦加密就不能解开,保护windows xp系统的双重密码 
services.msc 本地服务设置 
sndvol32 音量控制程序 
sfc.exe 系统文件检查器 
sfc /scannow windows文件保护 

tsshutdn 60秒倒计时关机命令 
tourstart xp简介(安装完成后出现的漫游xp程序) 
taskmgr 任务管理器 

eventvwr 事件查看器 
eudcedit 造字程序 
explorer 打开资源管理器 

packager 对象包装程序 
perfmon.msc 计算机性能监测程序 
progman 程序管理器 

regedit.exe 注册表 
rsop.msc 组策略结果集 
regedt32 注册表编辑器 
rononce -p 15秒关机 
regsvr32 /u *.dll 停止dll文件运行 
regsvr32 /u zipfldr.dll 取消zip支持 

cmd.exe cmd命令提示符 
chkdsk.exe chkdsk磁盘检查 
certmgr.msc 证书管理实用程序 
calc 启动计算器 
charmap 启动字符映射表 
cliconfg sql server 客户端网络实用程序 
clipbrd 剪贴板查看器 
conf 启动netmeeting 
compmgmt.msc 计算机管理 
cleanmgr 垃圾整理 
ciadv.msc 索引服务程序 

osk 打开屏幕键盘 
odbcad32 odbc数据源管理器 
oobe/msoobe /a 检查xp是否激活 
lusrmgr.msc 本机用户和组 
logoff 注销命令 

iexpress 木马捆绑工具,系统自带 

nslookup ip地址侦测器 

fsmgmt.msc 共享文件夹管理器 

utilman 辅助工具管理器 

gpedit.msc 组策略 

u2youtoo2004-12-12, 09:20 AM
比较有用的几个命令:
1.shutdown
中了冲击波、震荡波病毒后,可以用"shutdown -a"来中断系统关机,再进行杀毒处理。
详细的命令,可以在dos窗口下运行"shutdown /?"来看。

2.secpol.msc和gpedit.msc
注意需要输入msc后缀名。

3.oobe/msoobe /a 检查xp是否激活

关于honeypot的相关技术(转)

 

    近几年来,很少有人会否认信息安全已经成为网络管理员所面对的最严重问题。管理员必须花费大量的时间来确保他的网络已经安装了最新的安全补丁以及防火墙,同时入侵检测系统也能够记录所有的可疑活动。不幸的是,当前的防火墙和入侵检测系统已经不再像以前那样有效了,因为随着网络的不安全因素的增多,防火墙和入侵检测系统的日志内容也日益庞大,甚至有些系统每天的日志量就达1GB。在这个少花钱多办事的世界里,企业再也没有过多的人力用来每天处理如此大量的日志内容了。
   
  我并不是说防火墙日志和入侵检测系统的报告是毫无价值的。事实上它们确实认真地履行了各自的任务。不过当你看到如此大量的信息和报告,而其中大部分都是对系统没有威胁的无目的的扫描时,你肯定会感到很沮丧。难道真的没有一种更好的安全防范方法么?

Honeypot解决信息过量问题

  从某些角度来说,honeypot也许是一个更好的方法。Honeypot主要分为两类,真实的和虚拟的,这两类都是入侵者的诱饵。Honeypot这个概念来自几年前,那时候网络管理员希望有一种方法来找出到底是谁在探测网络。有句至理名言说“要想人不知,除非己莫为”,如果有人在探测网络,只要他向外发送数据,就一定会被察觉。因此有人利用了这个道理,在网络中建立了一个诱饵系统,它可以不时地向外发送与Windows网络服务有关的数据包,而那些监听网络的黑客获取数据包后,肯定会通过DNS查询来确定这个诱饵系统的更多资料。一旦DNS查询完成,则发送查询的主机名和IP地址包括查询时间就都会被记录下来。

  由于这种技术提出的较早,因此诱饵系统或者说是honeypots发展的非常迅速。到目前,有不少公司都能提供多种honeypot解决方案。如果你关注网络安全,那么honeypot系统确实能让你获益匪浅。但在应用honeypot系统前,你需要在真实的honeypot或虚拟honeypot之间做个选择。

真实vs虚拟

  对于真实或是虚拟honeypot的选择方面,你需要考虑的是风险和回报。虚拟honeypot比较廉价,但也有一定安全风险,它在抓住黑客方面做得没有真实的honeypot好。另一方面,虽然真实的honeypot在入侵检测方面比虚拟honeypot好很多,但最顶级的黑客有可能利用真实的honeypot接管你的网络。

虚拟honeypot的优势

  虚拟honeypot说白了是一个仿真程序。比如虚拟honeypot一般可以仿真FTP服务器,并监视所有的TCP和UDP端口并记录所有端口的活动情况。当黑客发现这个虚假的(他本人不知道)FTP时,就会试图开启一个FTP对话。这时虚拟FTP服务器(虚拟honeypot)就会记录下这个黑客的所有活动。比如honeypot会记录下哪个端口被使用、采用何种认证机制等。而虚拟FTP服务器会和真正的FTP服务器一样对黑客的行为作出响应。更好的是,由于这是个虚拟的FTP服务器,它没有真正的操作系统,因此就算黑客攻入了FTP,也不会进一步控制你网络中的其它电脑。

  理论上说,这个方法相当好,它使用起来相当安全,并且可以捕获大量的有用信息。比如,如果获取了黑客登录时的凭证,你就可以查出到底是哪个帐户被攻击了,这样就可以作出相应的补救动作。不过它的全部优势也就是这些了。

虚拟honeypot的劣势

  对于虚拟honeypot来说,有两点最主要的不足。首先,它只能愚弄那些初级黑客。你要记住,虚拟honeypot并没有一个真正的操作系统支撑(有的解决方案中内嵌了简单的Windows或Linux)。因此有经验的黑客会发现很多命令在这台主机中不起作用。这会使他立即知道自己进入的只是一台honeypot,而不是真正的服务器。

  虚拟honeypot的另一个不足是它记录的信息种类有限。比如一个虚拟honeypot伪装成FTP服务器,那么它就只能获取和FTP相关的信息。当然,大部分虚拟honeypot还可以获取端口扫描和其它一些基本的攻击信息。然而,如果一个黑客利用IPv6端口发送加密的信息又会如何呢?由于虚拟honeypot功能有限,它无法记录这类的问题。简单说,虚拟honeypot可以检测并记录已知的攻击种类,但对于新型的攻击却没什么用处。

真实honeypot的优势

  一个真正的honeypot,是一个或多个真实的系统组成的诱饵系统。由于它是带有操作系统的真实系统,因此它对于黑客的操作响应与网络上其它主机完全一样。这有好处也有坏处。好处是,黑客几乎不可能察觉到他们已经进入了一个陷阱,而不是真正的实用网络。实际上,唯一能让黑客起疑心的现象就是那些不太完善的honeypot网络没有采取任何正常的安全更新措施。

  真实的honeypot最大的优点就在于入侵检测能力。系统会假定任何发送到honeypot网络的数据都是带有恶意的,因此完全不用担心黑客会采用什么新方法而不被honeypot捕获。黑客的任何操作都会被真实的honeypot记录下来。

真实honeypot的劣势

  真实的honeypot也有不足,它有可能被高级黑客征服而变为进攻你的正常网络的跳板。为了防止这种情况,你需要在honeypot网络与正常网络间架设防火墙,以阻挡二者间的任何数据通信。更复杂的Linux honeypot带有防止黑客入侵正常网络的功能,而对于Windows上的honeypot,目前还没有类似的功能。

真实明显优于虚拟

  从多种环境考虑,真实的honeypot比虚拟honeypot更具优势。不过在你购买真实honeypot之前,你应该了解一下它的成本。除了购买机器外,你还需要购买操作系统以及其它安装在真实honeypot上的软件。最后你还要做好真实的honeypot会被最顶尖的黑客攻破的准备。

regsvr32命令(转)

这里有很多Regsvr32命令,看了后就明白了      
Regsvr32命令修复系统故障实例使用过activex的人都知道,activex不注册是不能够被系统识别和使用的,一般安装程序都会自动地把它所使用的activex控件注册,但如果你拿到的一个控件需要手动注册怎么办呢?如果修改注册表那就太麻烦了,在windows的system文件夹下有一个regsvr32.exe的程序,它就是windows自带的activex注册和反注册工具。

2000系统的regsvr32.exe在winnt\system32文件夹下;
WInXP系统的regsvr32.exe在windows\system32文件夹下

regsvr32的用法为:
"regsvr32 [/s] [/n] [/i(:cmdline)] dllname”。其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。

参数有如下意义:
/u——反注册控件
/s——不管注册成功与否,均不显示提示框
/c——控制台输出
/i——跳过控件的选项进行安装(与注册不同)
/n——不注册控件,此选项必须与/i选项一起使用

执行该命令的方法:

1、可以在“开始”--“运行”,调出运行的对话框,也可以使用Win+R热键,然后直接在输入栏输入即可
2、在开始--运行 输入cmd,调出‘命令提示符’窗口,然后再执行regsvr32命令。

二、Regsvr32错误消息的说明
当使用 Regsvr32.exe 时,它会尝试加载该组件并调用它的 DLLSelfRegister 函数。如果此尝试成功,Regsvr32.exe 会显示一个指示成功的对话框。如果此尝试失败,Regsvr32.exe 会返回一条错误消息,其中可能会包括一个 Win32 错误代码。

以下列表介绍了 RegSvr32 错误消息和可能的原因。

Unrecognized flag:/invalid_flag
键入的标志或开关组合无效(请参阅本文中的“Regsvr32.exe 的用法”一节)。
No DLL name specified.
未包括 .dll 文件名(请参阅本文中的“Regsvr32.exe 的用法”一节)。
Dllname was loaded, but the DllRegisterServer or DllUnregisterServer entry point was not found.
Dllname不是.dll 或.ocx 文件。例如,键入 regsvr32 wjview.exe 就会生成该错误消息。

例如,键入regsvr32 icwdial.dll 后就会返回该错误消息,因为 Icwdial.dll 文件不能自行注册。如果您怀疑内存中有损坏的Dllname 版本,请尝试重新启动计算机,或重新提取该文件的原始版本。如果您运行的是 Windows NT,可能需要使用 Microsoft Windows NT Server 4.0 资源工具包 中的 Kill 或 Pview 工具。有关其他信息,请单击以查看以下 Microsoft 知识库文章:197155 如何终止孤立进程OleInitialize failed (or OleUninitialize failed).

Regsvr32 必须先初始化 COM 库,然后才能调用所需的 COM 库函数并在关闭时撤消对该库的初始化。

一、轻松修复IE浏览器
regsvr32 Shdocvw.dll
regsvr32 Oleaut32.dll
regsvr32 Actxprxy.dll
regsvr32 Mshtml.dll
regsvr32 Urlmon.dll
regsvr32 browseui.dll

作用:
1、同时运行以上命令不仅可以解决IE不能打开新的窗口,用鼠标点击超链接也没有任何反应的问题;
2、还能解决大大小小的其它IE问题,比如网页显示不完整,JAVA效果不出现,网页不自动跳转,打开某些网站时总提示‘无法显示该页’等。

二、解决Windows无法在线升级的问题
regsvr32 wupdinfo.dll

作用:
Windows的漏洞很多,每隔一段时间就需要使用“Windows Update”升级程序进行在线升级,不过“Windows Update”经常出现无法使用的情况,这时,我们可以使用Regsvr32来解决这个问题。

三、防范网络脚本病毒有新招
regsvr32 /u scrrun.dll

作用:
网络脚本病毒嵌在网页中,上网时在不知不觉中机器就会感染上这种病毒。笔者认为单纯使用杀毒软件并不能有效地防范这些脚本病毒,必须从病毒传播的机理入手。网络脚本病毒的复制、传播都离不开FSO对象(File System Object,文件系统对象),因此禁用FSO对象就能有效地控制脚本病毒的传播。
如果需要使用FSO对象,键入“regsvr32 scrrun.dll”命令即可。

四、卸载Win XP自带的ZIP功能
regsvr32 /u zipfldr.dll

作用:
Win XP以功能强大而著称,但有些功能却常常令人有“鸡肋”之感,比如Win XP自带的ZIP功能和图片预览功能,不仅占用了系统资源,功能也远不如第三方软件强大。其实用Regsvr32命令可以很容易地卸载这些功能。

五、修复无法缩略图查看文件问题
2000: 开始→运行,输入regsvr32 thumbvw.dll
XP: 开始→运行,输入regsvr32 shimgvw.dll

六、让WMP播放器支持RM格式
很多朋友喜欢用Windows Media Player(以下简称WMP)播放器,但是它不支持RM格式,难道非得安装其它播放软件吗?笔者有办法。

以Win XP为例,首先下载一个RM格式插件,解压缩后得到两个文件夹: Release(用于Windows 9x)和Release Unicode (用于Windows 2000/XP);将Release Unicode文件夹下的RealMediaSplitter.ax文件拷贝到“系统盘符\WINDOWS\System32\”目录下;在“开始→运行”中键入“regsvr32 RealMediaSplitter.ax”,点击“确定”即可。接着下载解码器,如Real Alternative,安装后就能用WMP播放RM格式的影音文件了。

七、让WMP9的播放器出现

有些音乐网页的在线点歌需要用到Media Player,有的朋友明明安装了WMP9,但在线听音乐却只看到枯燥的WMP6播放器面板,想让漂亮的WMP9面板出现,当然没问题的。

常见问题的操作系统多数WIN 98,先关闭IE,再在“开始→运行”中键入“regsvr32 wmpdxm.dll”,点击“确定”即可。

八、解决打开系统功能时无反应regsvr32 shdocvw.dll

作用:
有时从开始菜单里点击XP系统的搜索功能、帮助和支持或管理工具等,但就是无任何反应,这是它们的打开方式缺少关联,所以我们只要用regsvr32注册它们需要调用的动态连接库文件就行了。

九、添加/删除程序打不开了regsvr32 appwiz.cpl
regsvr32 mshtml.dll
regsvr32 jscript.dll
regsvr32 msi.dll
regsvr32 "c:\program files\common files\system\ole db\oledb32.dll"
regsvr32 "c:\program files\common files\system\ado\msado15.dll"
regsvr32 mshtmled.dll
regsvr32 /i shdocvw.dll
regsvr32 /i shell32.dll

作用:
当打开控制面板中的添加/删除程序时,双击它的图标后无反应,或者打开后自动关闭了,尝试使用以上命令可以解决。

十、XP的用户帐户打不开regsvr32 nusrmgr.cpl
regsvr32 mshtml.dll
regsvr32 jscript.dll
regsvr32 /i shdocvw.dll

十一、防范网络脚本病毒有新招
regsvr32 /u scrrun.dll 禁用FSO对象
regsvr32 scrrun.dll 使用FSO对象

十二、解决Windows无法在线升级的问题regsvr32 wupdinfo.dll

以下症状我把它称作IE的活动脚本漏洞,虽然这两个命令能修复,但治标不治本,我建议遇到此问题的朋友到微软网站进行IE安全更新,即打漏洞补丁。

regsvr32 jscript.dll
regsvr32 vbscript.dll

作用:
1、跟上面讲的修复IE浏览器方法配合使用(可以不配),可以很好的解决浏览某些网页无法正常显示和功能不正常,如:
a.不显示某些验证码
b.不显示某些动态图片
c.不显示某些论坛的帖子列表
d.论坛快速跳转功能无用
e.论坛发贴时按Ctrl+Enter提交无反应

2、修复个别窗口空白,如XP的‘搜索’功能的搜索助理操作面板空白、系统还原页面空白和用户帐户页面空白等。(可修复把握度100%)

3、解决windows media player 9或以上版本打开时提示‘出现内部应用程序错误’。(可修复把握度100%)

4、可以修复win 2000的‘添加/删除程序’打开后一片空白。(可修复把握度99%)

5、解决win 2000以WEB方式查看Program Files文件夹和Winnt文件夹时看不到任何文件,以及‘控制面板’的图标跑到左边去的问题。

6、解决网页上网际快车的右键菜单功能无法使用。
在网站中,当右键点某个‘下载连接’时,会弹出菜单,选择‘使用网际快车下载’会再弹出FLASHGET的下载任务页面,如果发现该功能无反应,那就可能是这个原因:原来这项菜单是调用了FLASHGET目录下的jc_link.htm文件,这个文件是用VB语言编写的,所以其作用丢失是动态连接库vbscript.dll没有注册和调用到。
不过这只是原因之一.

大学生-自传 (转)

转眼间在从大一踏进学校的校门到现在刚刚好两年了,在这两年里面,有学到了不少东西,包括怎么去独立生活,怎么去与人沟通,等等,当然最重要的还是学到了自己想要的专业知识。

  记得大一的时候主要是学习计算机导论和C语言,对于急于想看到效果的我,C语言学起来就比较枯燥,因为C语言编写出来的程序主要还是在命令行的操作,我很想开发出windows界面的软件出来,但是没有办法,C语言是基础,没有这个基础就往高处想,恐怕梦想不会那么容易实现。所以我就认真的把C语言的基础打好,先掌握好里面的语法,程序控制逻辑和一些基本的算法,说真的,尽管是比较枯燥,但是一旦陷入了编程中,自然就会发现其中的快乐。

  大一第二学期的时候开始接触NIIT的课程,平时虽然一点作业都没有,但是我上课的时候不是那么认真听课的人,所以课后总是要花时间来看看和理解老师上课的例子,在这个学期中,我们主要学习了C++和Java,都是刚刚开始接触到面向对象的语言中来,由于对一些面向对象的特性不熟悉,毕竟是刚开始接触这方面的语言,所以学起来就有点吃力,再加上平时实践的时间比较少。

  终于到了学期的期末,学期期末的项目是使用Java语言开发一个网络的聊天室,在我还没有开发之前一听到这个项目,我做梦都没有想到我可以编写出一个聊天室出来,但是既然是课程提出来的项目,就一定有它的理由,我也相信最后一定也可以完成它。功夫不负有心人,经过接近一个月的研究,我总于完成了我来到学校的第一件作品。在这个月中,我不断得查阅资料,询问老师,平时和同学多交流,终于在最后的评审中,我获得了全班第二的好成绩。通过这个学期的开发中,我几乎把整个学期学到的知识都用到了我的聊天室里面,所以在实践中也等于复习了这个学期所学的内容,而且我发现这样的实践,比我在平时课后看书,看资料所学到的还多。
大二的第一学期,进入了数据库和高级Java的学习,说真的,在学数据库的那段时期是最烦的,因为每天就学了一大堆SQL的语言,非常的枯燥,都是关于怎么去查找数据表格里面的内容,那是时期,因为课堂上听课了之后觉得都是比较简单的,所以课后很少去动手。到了后来项目开发中,我才发现数据库的重要性,整个系统的信息都是存储在数据库里面的,所有的在程序中对数据的操作都是等同于对数据的增删改查询操作。

  在期末的项目中,根据项目所要求的内容,我不断翻看以前没有掌握好的数据库知识,感觉如果我前面有认真学习的话,到了后面开发项目的时候就不会那么吃力了。对此,我总结出,如果在前面学数据库的时候不要单纯学习SQL的语言,把数据库和程序结合起来,如果老师的讲课的过程中可以说清楚数据库怎么绑定到程序中去使用的话,那么我想对于我来说我会更加有兴趣去学好数据库,因为只要在程序开发中才可以去体验数据库的魅力和重大的作用。

  在学期末的J2EE开发电子商务网站中,我学到了很多关于怎么制作动态网页的一些必要元素的基本的原理,体会到软件设计在网站开发中的重要性。

  转眼间来到了大二的第二个学期,可以说在这个学期中,是我最有感触,学到最多知识,达到质的飞跃的一个重要学期。有了前面几个学期的学习基础,我对面向对象语言已经基本掌握清楚,运用起来也觉得没有什么特别困难,基本已经入门了,这个学期主要是进入了.net的学习。

  好的开发工具是保证效率的一个重要因素,Microsoft Visual Studio .NET 2003就是这样的一个开发工具,令我刚刚一接触就深深得爱上了它,它的易学易用令我对编程的兴趣倍增,以前学习Java之所以见效不大是因为没有好的开发工具和环境,总是在环境配置中浪费大量的时间,而真正的涉及到编程很少,所以这也是我以前为什么学起来没有那么有兴趣的原因。

  我觉得学编程就应该学习它的思想,编写代码就应该尽量避免写出与逻辑无关的代码,比如界面代码可以让机器去自动生成不必浪费时间手动去编写,所以好的开发工具可以帮助我们做到这一点,只编程逻辑代码,很多代码都可以让机器去自动生成。在.net就可以快速地开发既有漂亮界面也有强大功能的程序。有了这么好的开发工具,所以令我顿时感悟,有种相见恨晚的感觉。
有了好的开发工具后接下来要做什么呢,当我们为之兴奋的时候,当然是很有欲望去做出某某自己很想做的东西,因为你一拿到好的开发工具,就会整天的陷入开发状态,对其爱不释手,一开始我是试着开发一个Flash播放器,感觉编写起来不是编写起来不是那么难,因为前面已经有学习Java的经验了,初次学习.net的时候选择编写Flash播放器也是有理由的,一方面是程序比较简单,另一方面的涉及到的控件和界面比较多,所以一开始接触这样的语言就首先学习怎么去调用.net平台上提供的控件,只要掌握好这些控件,以后编写windows界面的控件就简单很多了。

  经过几天的时间,终于把Flash播放器做出来了,以后想Flash影集的时候都用自己开发的播放器进行播放,感觉别有一翻滋味,因为这就是为自己量身定做的,这就使我再一次感觉到开发的乐趣。

  每年的11月份都有一个高校杯的软件设计大赛,这时间正到了5月,我们屈指一算,离比赛的时间还有6个月的时间,这段时间我正处在开发的兴奋期,所以对这个软件设计比赛就感兴趣起来,第一是可以知道自己的编程程度和其他人的距离,第二是可以利用这个一个项目实践来锻炼自己的开发技能,第三是可以锻炼团队的合作。以前几乎都是自己开发的软件,很少和其他人合作,所以就令我想到这种开发模式将来带到工作会另自己处于不利的地位,现在不是都讲究团队的合作么。

  经过思考后,我找来另外的两个志同道合的同学,利用五一放假的时间想好主题,还有进行需求分析,最后定下来“多媒体日记本”这一项目。定好题目后我们就进行了分工,一个人负责数据库方面,一个人负责界面的美化和界面的布局,另外一个负责功能的实现,分好工后我们立刻就展开了工作,在合作的过程中,我们学到了许多课本上没讲的或者只是粗略带过的知识,有些特别的技术难点还要到网上去搜索,查阅有关的资料,在语言方面我们几乎把.net里面的基本框架和特性都用上了,这样对于我们学习就达到了事半功倍的效果,边学边做学到的知识可以很快吸收,又可以很快得运用的实际中去,这是我通过这个项目感触最深的。很快就到了期末,学校举行“IT精英杯”软件大赛,我们小组终于不负众望,拿到了一等奖的好成绩。

  经过这次我比赛我总结出心得,首先比赛的题目要定好,一方面是开发的软件要有实用性和市场前景,另一方面还要在实用性上加上点创新,给人耳目一新的感觉,我觉得只要先抓住好这两点,做出来的软件才会给人留下好的印象。
 利用暑假的时间,我又参加系里面组织的软件工程培训,又一次在开发项目中学到了许多许多看书只能朦胧懂的知识。

  转眼间大三第一个学期就开学了,回顾这两年来学习软件开发的经历,写了这样的一遍心得,一方面算是对自己的总结,另一方面也可以拿出来给大家参考和交流。最后我还是要再归纳一次,总结出如何才可以比较容易地进入学习状态达到快速开发的目的。

  1. 打好基础,掌握好C语言C++基础的语言,对学习数据结构和算法有很大的帮助。

  2. 面向对象是高级也是最流行的语言,所有的面向对象语言几乎都是通用的,结构和特性都差不多,只要掌握和归纳好它们的一些共同的特性,哪怕将来转向其他的语言都是轻而易举,得心应手,达到融会贯通的效果。

  3. 好的开发工具是你提高开发效率,提高编程兴趣的前提,学习语言的过程中还应该研究怎么利用开发工具有效地提高开发的效率。

  4. 善于总结,在开发过程中我们可以总结出许许多多规律性的东西,这些规律一方面可以让我们避免在以后的开发中犯同样的错误,另一方面对我们掌握其他的规律都是有所帮助的,规律都是交叉在一起的。跟着规律走,实事求是。

  5. 项目开发是最好的学习方法,这一点是我最有感触的,软件开发是实践性很强的活动,但靠理论知识学起来比较吃力,而且枯燥无味,学习种理论学习和开发实践的比例应该是1:2,而且是交叉进行。这样才可以比较快的掌握一个知识点。

  6. 团队合作,现在的项目几乎很少一个人去完成,频繁的沟通和密切的配合是成功的必要条件。

乱来批处理之FTP基础 (转)

导语:

======了解一下ftp的命令吧..
主要的有:get 下载 
         put 上传
         bin 2进制传输数据
         open 连接
         ...
======
问题:如何来有批处理让ftp登陆,实现命令...

试验:
bat.bat
-----------
ftp dd.dd.com //假设地址
UserName
PassWord
命令...
bye
exit
-----------
如果这样的话显然不行..运行到连接dd.dd.com之后就要手动输入了...麻烦-_-!
ftp 命令里面的参数有个-s的,作用是在执行ftp时读取一个文件....
具体的是这样的:ftp -s:dd.dd
其中dd.dd是一个文件名称...
哈哈..这样的话就ok了....
我们只要在dd.dd这个文件里面输入ftp的命令不就ok了吗?
好,我们马上来make
dd.dd
============================
open dd.dd.com
user
用户名
密码
命令...
....
bye
exit
============================
OK这样DD.DD的文件就写好了..
我们可以手动的输入:ftp -s:dd.dd
想到这里..麻烦来了..还是要手动的..(象个半自动程序0_0!)
等等..我们还是可以在建立一个.bet file
dd.bat
============================
ftp -s:dd.dd
============================
注意dd.dd 和dd.bat 要在一个目录下面才可以的..!
 
最后在提醒几点...如果程序运行成功..可是没有达到预期目的..

比如要在public_html/mm/ 目录下面下载mm.exe文件

可以却没有成功...下载下来的mm.exe文件是0 btyes

那你要看看是否你cd 的目录名称正确...关于一些细节..都会导致下载文件的失败...
====---------------------------
总结:
今天我们学会了简单的利用批处理的方法实现的ftp下自动连接,登陆,执行命令的方法...
大家可以适当的去扩展一下....

乱来批处理之DOS基础(转)

导语:
今天我要说说批处理...当然是win下面的喽..
下面我来介绍一下win下面批处理...
所谓批处理就是win下面dos命令集合..
然后把这些命令都一条一条的放到一个文件里面
而这个文件的扩展名为.bat
好了现在我来说一些小技巧..
是不是你就在.把它文件里面就白命令打进去然后运行的话就会显示命令然后在运行命令..
显的麻烦..如何不让他显示呢??
那就在第一句写上:@echo off  这样就关闭了回显的功能了...哈哈..
还有就是在每条命令前加上@符号..就OK了...
很多的黑客和黑客爱好者都是用这些方法让批处理程序停止回显..以防用户看见.

====首先我们要了解DOS命令(多少要由你自己需要而定..)===
命令:cd  进入目录
命令:netstat 查看连接情况 相关参数:-a -n -r ....
命令:del  删除文件
命令:dir  查看
命令:rem  注解
命令:pause 挂起
命令:copy  复制
命令:echo 显示
命令:可执行文件
命令:and so on...
这些命令是比较简单的..基本的用法也简单..
如果你对DOS命令不够了解可以访问[http://www.pconline.com.cn/pcedu/rookie/basic/10111/15325.html]
=======================================================
好了..现在我们来自己来写一个批处理...(激动呀..)
目的:查看主机的连接情况
构思:1.在DOS窗口显示:now:start listen...
     2.将返回的信息写入listen_log.txt文本文件并执行它,
     3.关必程序并程序自动删除listen_log.txt
================start write down=======================

@echo off
rem 关闭回显
@echo Now,start listen
rem 输出 
@netstat 
-an >>listen_txt.txt
rem 查看主机连接情况并写入文本文件
@Listen_txt.txt
rem 打开文本
@pause
rem 挂起
@del Listen_log.txt
rem 删除文本


===============end=====================================
好了.就这么几行的命令组合就可以让你在文本里面查看主机的连接情况..
并且关闭是程序自动删除listen_log.txt文本文件..以防下次运行是内容增加...
-----------------------------------
我给你写批处理给大家看看...(看不动没事..)

@echo Windows Registry Editor Version 5.00 >patch.dll
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters] 
>>patch.dll
@echo 
"AutoShareServer"=dword:00000000 >>patch.dll
@echo 
"AutoShareWks"=dword:00000000 >>patch.dll
@REM [禁止共享]
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa] 
>>patch.dll
@echo 
"restrictanonymous"=dword:00000001 >>patch.dll
@REM [禁止匿名登录]
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters] 
>>patch.dll
@echo 
"SMBDeviceEnabled"=dword:00000000 >>patch.dll
@REM [禁止及文件访问和打印共享]
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices@REMoteRegistry] 
>>patch.dll
@echo 
"Start"=dword:00000004 >>patch.dll
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSchedule] 
>>patch.dll
@echo 
"Start"=dword:00000004 >>patch.dll
@regedit 
/s patch.dll
@del patch.dll


rem 这是一个禁止服务的批处理...
-----------------------------------
Good bye !

网络三大协议说明(转)

网络协议(protocol)是一种特殊的软件,是计算机网络实现其功能的最基本机制。网络协议的本质是规则,即各种硬件和软件必须遵循的共同守则。网络协议并不是一套单独的软件,它融合于其他所有的软件系统中,因此可以说,协议在网络中无所不在。网络协议遍及osi通信模型的各个层次,从我们非常熟悉的tcp/ip、http、ftp协议,到ospf、igp等协议,有上千种之多。对于普通用户而言,不需要关心太多的 
底层通信协议,只需要了解其通信原理即可。在实际管理中,底层通信协议一般会自动工作,不需要人工干预。但是对于第三层以上的协议,就经常需要人工干预了,比如tcp/ip协议就需要人工配置它才能正常工作。

  局域网常用的三种通信协议分别是tcp/ip协议、netbeui协议和ipx/spx协议。 tcp/ip协议毫无疑问是这三大协议中最重要的一个,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的*作都离不开tcp/ip协议。不过tcp/ip协议也是这三大协议中配置起来最麻烦的一个,单机上网还好,而通过局域网访问互联网的话,就要详细设置ip地址,网关,子网掩码,dns服务器等参数。

  tcp/ip尽管是目前最流行的网络协议,但tcp/ip协议在局域网中的通信效率并不高,使用它在浏览“网上邻居”中的计算机时,经常会出现不能正常浏览的现象。此时安装netbeui协议就会解决这个问题。netbeui即netbios enhanced user interface ,或netbios增强用户接口。它是netbios协议的增强版本,曾被许多*作系统采用,例如windows for workgroup、win 9x系列、windows nt等。netbeui协议在许多情形下很有用,是windows98之前的*作系统的缺省协议。总之netbeui协议是一种短小精悍、通信效率高的广播型协议,安装后不需要进行设置,特别适合于在“网络邻居”传送数据。所以建议除了tcp/ip协议之外,局域网的计算机最好也安上netbeui协议。另外还有一点要注意,如果一台只装了tcp/ip协议的windows98机器要想加入到winnt域,也必须安装netbeui协议。

  ipx/spx协议本来就是novell开发的专用于netware网络中的协议,但是现在也非常常用--大部分可以联机的游戏都支持ipx/spx协议,比如星际争霸,反恐精英等等。虽然这些游戏通过tcp/ip协议也能联机,但显然还是通过ipx/spx协议更省事,因为根本不需要任何设置。除此之外,ipx/spx协议在局域网络中的用途似乎并不是很大,如果确定不在局域网中联机玩游戏,那么这个协议可有可无。

利用Google突破封锁下载你要的东西(转)

在搜索框上输入: “index of/ ”  inurl:lib
再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍。

在搜索框上输入: “index of /”  cnki
再按搜索你就可以找到许多图书馆的CNKI、VIP、超星等入口!

在搜索框上输入: “index of /”  ppt
再按搜索你就可以突破网站入口下载powerpint作品!

在搜索框上输入: “index of /”  mp3
再按搜索你就可以突破网站入口下载mp3、rm等影视作品!

在搜索框上输入: “index of /”  swf
再按搜索你就可以突破网站入口下载flash作品!

在搜索框上输入: “index of /”  要下载的软件名
再按搜索你就可以突破网站入口下载软件!

注意引号应是英文的!

再透露一下,如果你输入:

“index of /”  AVI
你会找到什么呢?同理,把AVI换为MPEG看看又会找到什么呢?呵呵!接下来不用我再教了吧?

这个便于大家查询你自己需要的东西!

跟我学TCP端口:作用,漏洞,操作详析(转)

在上网的时候,我们经常会看到“端口”这个词,也会经常用到端口号,比如在FTP地址后面增加的“21”,21就表示端口号。那么端口到底是什么意思呢?怎样查看端口号呢?一个端口是否成为网络恶意攻击的大门呢?,我们应该如何面对形形色色的端口呢?下面就将介绍这方面的内容,以供大家参考。

  21端口:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务。

  端口说明:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务,FTP服务主要是为了在两台计算机之间实现文件的上传与下载,一台计算机作为FTP客户端,另一台计算机作为FTP服务器,可以采用匿名(anonymous)登录和授权用户名与密码登录两种方式登录FTP服务器。目前,通过FTP服务来实现文件的传输是互联网上上传、下载文件最主要的方法。另外,还有一个20端口是用于FTP数据传输的默认端口号。

  在Windows中可以通过Internet信息服务(IIS)来提供FTP连接和管理,也可以单独安装FTP服务器软件来实现FTP功能,比如常见的FTP Serv-U。

  操作建议:因为有的FTP服务器可以通过匿名登录,所以常常会被黑客利用。另外,21端口还会被一些木马利用,比如Blade Runner、FTP Trojan、Doly Trojan、WebEx等等。如果不架设FTP服务器,建议关闭21端口。 23端口:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序。

  端口说明:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序。同样需要设置客户端和服务器端,开启Telnet服务的客户端就可以登录远程Telnet服务器,采用授权用户名和密码登录。登录之后,允许用户使用命令提示符窗口进行相应的操作。在Windows中可以在命令提示符窗口中,键入“Telnet”命令来使用Telnet远程登录。

  操作建议:利用Telnet服务,黑客可以搜索远程登录Unix的服务,扫描操作系统的类型。而且在Windows 2000中Telnet服务存在多个严重的漏洞,比如提升权限、拒绝服务等,可以让远程服务器崩溃。Telnet服务的23端口也是TTS(Tiny Telnet Server)木马的缺省端口。所以,建议关闭23端口。

  25端口:25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。

  端口说明:25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。比如我们在使用电子邮件客户端程序的时候,在创建账户时会要求输入SMTP服务器地址,该服务器地址默认情况下使用的就是25端口。

  端口漏洞:

  1. 利用25端口,黑客可以寻找SMTP服务器,用来转发垃圾邮件。

  2. 25端口被很多木马程序所开放,比如Ajan、Antigen、Email Password Sender、ProMail、trojan、Tapiras、Terminator、WinPC、WinSpy等等。拿WinSpy来说,通过开放25端口,可以监视计算机正在运行的所有窗口和模块。

  操作建议:如果不是要架设SMTP邮件服务器,可以将该端口关闭。

53端口:53端口为DNS(Domain Name Server,域名服务器)服务器所开放,主要用于域名解析,DNS服务在NT系统中使用的最为广泛。

  端口说明:53端口为DNS(Domain Name Server,域名服务器)服务器所开放,主要用于域名解析,DNS服务在NT系统中使用的最为广泛。通过DNS服务器可以实现域名与IP地址之间的转换,只要记住域名就可以快速访问网站。

  端口漏洞:如果开放DNS服务,黑客可以通过分析DNS服务器而直接获取Web服务器等主机的IP地址,再利用53端口突破某些不稳定的防火墙,从而实施攻击。近日,美国一家公司也公布了10个最易遭黑客攻击的漏洞,其中第一位的就是DNS服务器的BIND漏洞。

  操作建议:如果当前的计算机不是用于提供域名解析服务,建议关闭该端口。

  67、68端口:67、68端口分别是为Bootp服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端口。

  端口说明:67、68端口分别是为Bootp服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端口。Bootp服务是一种产生于早期Unix的远程启动协议,我们现在经常用到的DHCP服务就是从Bootp服务扩展而来的。通过Bootp服务可以为局域网中的计算机动态分配IP地址,而不需要每个用户去设置静态IP地址。

  端口漏洞:如果开放Bootp服务,常常会被黑客利用分配的一个IP地址作为局部路由器通过“中间人”(man-in-middle)方式进行攻击。

  操作建议:建议关闭该端口。

  69端口:TFTP是Cisco公司开发的一个简单文件传输协议,类似于FTP。

  端口说明:69端口是为TFTP(Trival File Tranfer Protocol,次要文件传输协议)服务开放的,TFTP是Cisco公司开发的一个简单文件传输协议,类似于FTP。不过与FTP相比,TFTP不具有复杂的交互存取接口和认证控制,该服务适用于不需要复杂交换环境的客户端和服务器之间进行数据传输。

  端口漏洞:很多服务器和Bootp服务一起提供TFTP服务,主要用于从系统下载启动代码。可是,因为TFTP服务可以在系统中写入文件,而且黑客还可以利用TFTP的错误配置来从系统获取任何文件。

  操作建议:建议关闭该端口。

  79端口:79端口是为Finger服务开放的,主要用于查询远程主机在线用户、操作系统类型以及是否缓冲区溢出等用户的详细信息。

  端口说明:79端口是为Finger服务开放的,主要用于查询远程主机在线用户、操作系统类型以及是否缓冲区溢出等用户的详细信息。比如要显示远程计算机www.abc.com上的user01用户的信息,可以在命令行中键入“finger user01@www.abc.com”即可。

  端口漏洞:一般黑客要攻击对方的计算机,都是通过相应的端口扫描工具来获得相关信息,比如使用“流光”就可以利用79端口来扫描远程计算机操作系统版本,获得用户信息,还能探测已知的缓冲区溢出错误。这样,就容易遭遇到黑客的攻击。而且,79端口还被Firehotcker木马作为默认的端口。

  操作建议:建议关闭该端口。

  80端口:80端口是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,这是上网冲浪使用最多的协议,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议。

  端口说明:80端口是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,这是上网冲浪使用最多的协议,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议。我们可以通过HTTP地址加“:80”(即常说的“网址”)来访问网站的,比如http://www.cce.com.cn:80,因为浏览网页服务默认的端口号是80,所以只要输入网址,不用输入“:80”。

  端口漏洞:有些木马程序可以利用80端口来攻击计算机的,比如Executor、RingZero等。

  操作建议:为了能正常上网冲浪,我们必须开启80端口。

99端口:99端口是用于一个名为“Metagram Relay”(亚对策延时)的服务,该服务比较少见,一般是用不到的。

  端口说明:99端口是用于一个名为“Metagram Relay”(亚对策延时)的服务,该服务比较少见,一般是用不到的。

  端口漏洞:虽然“Metagram Relay”服务不常用,可是Hidden Port、NCx99等木马程序会利用该端口,比如在Windows 2000中,NCx99可以把cmd.exe程序绑定到99端口,这样用Telnet就可以连接到服务器,随意添加用户、更改权限。

  操作建议:建议关闭该端口。

  109、110端口:109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端口是为POP3(邮件协议3)服务开放的,POP2、POP3都是主要用于接收邮件的。

  端口说明:109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端口是为POP3(邮件协议3)服务开放的,POP2、POP3都是主要用于接收邮件的,目前POP3使用的比较多,许多服务器都同时支持POP2和POP3。客户端可以使用POP3协议来访问服务端的邮件服务,如今ISP的绝大多数邮件服务器都是使用该协议。在使用电子邮件客户端程序的时候,会要求输入POP3服务器地址,默认情况下使用的就是110端口。

  端口漏洞:POP2、POP3在提供邮件接收服务的同时,也出现了不少的漏洞。单单POP3服务在用户名和密码交换缓冲区溢出的漏洞就不少于20个,比如WebEasyMail POP3 Server合法用户名信息泄露漏洞,通过该漏洞远程攻击者可以验证用户账户的存在。另外,110端口也被ProMail trojan等木马程序所利用,通过110端口可以窃取POP账号用户名和密码。

  操作建议:如果是执行邮件服务器,可以打开该端口。

  111端口:111端口是SUN公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,RPC在多种网络服务中都是很重要的组件。

  端口说明:111端口是SUN公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,RPC在多种网络服务中都是很重要的组件。常见的RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等等。在Microsoft的Windows中,同样也有RPC服务。

  端口漏洞:SUN RPC有一个比较大漏洞,就是在多个RPC服务时xdr_array函数存在远程缓冲溢出漏洞,通过该漏洞允许攻击者传递超

  113端口:113端口主要用于Windows的“Authentication Service”(验证服务)。

  端口说明:113端口主要用于Windows的“Authentication Service”(验证服务),一般与网络连接的计算机都运行该服务,主要用于验证TCP连接的用户,通过该服务可以获得连接计算机的信息。在Windows 2000/2003 Server中,还有专门的IAS组件,通过该组件可以方便远程访问中进行身份验证以及策略管理。

  端口漏洞:113端口虽然可以方便身份验证,但是也常常被作为FTP、POP、SMTP、IMAP以及IRC等网络服务的记录器,这样会被相应的木马程序所利用,比如基于IRC聊天室控制的木马。另外,113端口还是Invisible Identd Deamon、Kazimas等木马默认开放的端口。

  操作建议:建议关闭该端口。

  119端口:119端口是为“Network News Transfer Protocol”(网络新闻组传输协议,简称NNTP)开放的。

  端口说明:119端口是为“Network News Transfer Protocol”(网络新闻组传输协议,简称NNTP)开放的,主要用于新闻组的传输,当查找USENET服务器的时候会使用该端口。

  端口漏洞:著名的Happy99蠕虫病毒默认开放的就是119端口,如果中了该病毒会不断发送电子邮件进行传播,并造成网络的堵塞。

  操作建议:如果是经常使用USENET新闻组,就要注意不定期关闭该端口。 135端口:135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务。

  端口说明:135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨包括HTTP协议在内的多种网络传输。

  端口漏洞:相信去年很多Windows 2000和Windows XP用户都中了“冲击波”病毒,该病毒就是利用RPC漏洞来攻击计算机的。RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。该漏洞会影响到RPC与DCOM之间的一个接口,该接口侦听的端口就是135。

  操作建议:为了避免“冲击波”病毒的攻击,建议关闭该端口。

  137端口:137端口主要用于“NetBIOS Name Service”(NetBIOS名称服务)。

  端口说明:137端口主要用于“NetBIOS Name Service”(NetBIOS名称服务),属于UDP端口,使用者只需要向局域网或互联网上的某台计算机的137端口发送一个请求,就可以获取该计算机的名称、注册用户名,以及是否安装主域控制器、IIS是否正在运行等信息。

  端口漏洞:因为是UDP端口,对于攻击者来说,通过发送请求很容易就获取目标计算机的相关信息,有些信息是直接可以被利用,并分析漏洞的,比如IIS服务。另外,通过捕获正在利用137端口进行通信的信息包,还可能得到目标计算机的启动和关闭的时间,这样就可以利用专门的工具来攻击。

  操作建议:建议关闭该端口。

  139端口:139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。

  端口说明:139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。在Windows中要在局域网中进行文件的共享,必须使用该服务。比如在Windows 98中,可以打开“控制面板”,双击“网络”图标,在“配置”选项卡中单击“文件及打印共享”按钮选中相应的设置就可以安装启用该服务;在Windows 2000/XP中,可以打开“控制面板”,双击“网络连接”图标,打开本地连接属性;接着,在属性窗口的“常规”选项卡中选择“Internet协议(TCP/IP)”,单击“属性”按钮;然后在打开的窗口中,单击“高级”按钮;在“高级TCP/IP设置”窗口中选择“WINS”选项卡,在“NetBIOS设置”区域中启用TCP/IP上的NetBIOS。

  端口漏洞:开启139端口虽然可以提供共享服务,但是常常被攻击者所利用进行攻击,比如使用流光、SuperScan等端口扫描工具,可以扫描目标计算机的139端口,如果发现有漏洞,可以试图获取用户名和密码,这是非常危险的。

  操作建议:如果不需要提供文件和打印机共享,建议关闭该端口。

  143端口:143端口主要是用于“Internet Message Access Protocol”v2(Internet消息访问协议,简称IMAP)。

  端口说明:143端口主要是用于“Internet Message Access Protocol”v2(Internet消息访问协议,简称IMAP),和POP3一样,是用于电子邮件的接收的协议。通过IMAP协议我们可以在不接收邮件的情况下,知道信件的内容,方便管理服务器中的电子邮件。不过,相对于POP3协议要负责一些。如今,大部分主流的电子邮件客户端软件都支持该协议。

  端口漏洞:同POP3协议的110端口一样,IMAP使用的143端口也存在缓冲区溢出漏洞,通过该漏洞可以获取用户名和密码。另外,还有一种名为“admv0rm”的Linux蠕虫病毒会利用该端口进行繁殖。

  操作建议:如果不是使用IMAP服务器操作,应该将该端口关闭。

  161端口:161端口是用于“Simple Network Management Protocol”(简单网络管理协议,简称SNMP)。

  端口说明:161端口是用于“Simple Network Management Protocol”(简单网络管理协议,简称SNMP),该协议主要用于管理TCP/IP网络中的网络协议,在Windows中通过SNMP服务可以提供关于TCP/IP网络上主机以及各种网络设备的状态信息。目前,几乎所有的网络设备厂商都实现对SNMP的支持。

  在Windows 2000/XP中要安装SNMP服务,我们首先可以打开“Windows组件向导”,在“组件”中选择“管理和监视工具”,单击“详细信息”按钮就可以看到“简单网络管理协议(SNMP)”,选中该组件;然后,单击“下一步”就可以进行安装。

  端口漏洞:因为通过SNMP可以获得网络中各种设备的状态信息,还能用于对网络设备的控制,所以黑客可以通过SNMP漏洞来完全控制网络。

  操作建议:建议关闭该端口443端口:443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。

  端口说明:443端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站,比如银行、证券、购物等,都采用HTTPS服务,这样在这些网站上的交换信息其他人都无法看到,保证了交易的安全性。网页的地址以https://开始,而不是常见的http://。

  端口漏洞:HTTPS服务一般是通过SSL(安全套接字层)来保证安全性的,但是SSL漏洞可能会受到黑客的攻击,比如可以黑掉在线银行系统,盗取信用卡账号等。

  操作建议:建议开启该端口,用于安全性网页的访问。另外,为了防止黑客的攻击,应该及时安装微软针对SSL漏洞发布的最新安全补丁。

  554端口:554端口默认情况下用于“Real Time Streaming Protocol”(实时流协议,简称RTSP)。

  端口说明:554端口默认情况下用于“Real Time Streaming Protocol”(实时流协议,简称RTSP),该协议是由RealNetworks和Netscape共同提出的,通过RTSP协议可以借助于Internet将流媒体文件传送到RealPlayer中播放,并能有效地、最大限度地利用有限的网络带宽,传输的流媒体文件一般是Real服务器发布的,包括有.rm、.ram。如今,很多的下载软件都支持RTSP协议,比如FlashGet、影音传送带等等。

  端口漏洞:目前,RTSP协议所发现的漏洞主要就是RealNetworks早期发布的Helix Universal Server存在缓冲区溢出漏洞,相对来说,使用的554端口是安全的。

  操作建议:为了能欣赏并下载到RTSP协议的流媒体文件,建议开启554端口。

  1024端口:1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。

  端口说明:1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。之前,我们曾经提到过动态端口的范围是从1024~65535,而1024正是动态端口的开始。该端口一般分配给第一个向系统发出申请的服务,在关闭服务的时候,就会释放1024端口,等待其他服务的调用。

  端口漏洞:著名的YAI木马病毒默认使用的就是1024端口,通过该木马可以远程控制目标计算机,获取计算机的屏幕图像、记录键盘事件、获取密码等,后果是比较严重的。

  操作建议:一般的杀毒软件都可以方便地进行YAI病毒的查杀,所以在确认无YAI病毒的情况下建议开启该端口。

通信网络安全分层及关键技术解决

要实现信息化,就必须重视信息网络安全。信息网络安全绝不仅是IT行业的问题,而是一个社会问题,是一个包括多学科的系统安全工程问题,并直接关系到国家安全。因此,知名安全专家沈昌祥院士呼吁,要像重视两弹一星那样去重视信息安全。通信网络作为信息传递的一种主要载体,其安全性是信息安全中关键问题之一。

    通信网络安全含义与分层

    为明确通信网络安全含义,必须首先定义信息安全。信息安全定义如下:信息安全通常是指信息在采集、传递、存储和应用等过程中的完整性、机密性、可用性、可控性和不可否认性。

    为实现上述信息安全,需要:

    ·建立信息安全管理机制,制定信息安全策略;

    ·制定信息安全测评标准来评估和划分安全等级;

    ·使用安全管理、产品和网络来保障采集、传递、存储和应用时的机密性、完整性、可用性、可控行以及不可否认性;

    ·应用检测机制来获悉当前安全状态;

    ·通过故障和灾难恢复机制来解决出现的问题。

    一般认为,信息网络安全是指信息在利用网络提供的服务进行传递的过程中,通信网络自身(即承载网和业务网)的可靠性、生存性;网络服务的可用性、可控性;信息传递过程中信息的完整性、机密性和不可否认性。(本文中所指通信网络安全不涉及通信内容是否违反中华人民共和国电信条例第五十七条所规定的内容。)

    通信网络安全通常包括承载网与业务网安全,网络服务安全以及信息传递安全。通信网络安全不涉及意识形态安全。

    ·承载网与业务网安全包括网络可靠性与生存性。网络可靠性与生存性依靠环境安全、物理安全、节点安全、链路安全、拓扑安全、系统安全等方面来保障。这里承载网与业务网是拥有自己节点、链路、拓扑和控制的网络,例如传输网、互联网、ATM网、帧中继网、DDN网、X.25网、电话网、移动通信网、支撑网等电信网络。

    ·网络服务安全包括服务可用性与服务可控性。服务可用性与承载网和业务网可靠性及维护能力等相关。服务可控性依靠服务接入安全,以及服务防否认、服务防攻击等方面来保障。服务可以是网络提供的DDN专线、ATM专线、话音业务、VPN业务、INterNet业务等。

    ·信息传递安全包括信息完整性、机密性和不可否认性。信息完整性可以依靠报文鉴别机制(例如哈希算法等)来保障;信息机密性可以依靠加密机制以及密钥分发等来保障;信息不可否认性可以依靠数字签名等技术保障。

    ·意识形态安全是指传递的信息不包含中华人民共和国电信条例第五十七条所规定内容。第五十七条规定不得利用电信网制作、复制、发布、传播含有违反国家宪法、危害国家安全、泄露国家机密、颠覆国家政权、破坏国家统一、损害国家荣誉和利益、煽动民族仇恨和民族歧视、破坏安定团结等内容。

    通信网络安全关键技术

    1.安全性分析评估

    当前通信网络功能越来越强大,相应的设备软硬件越来越复杂。网络自身的安全性依赖设备安全性及网络管理。目前网络上运行着大量国外引进设备,即使是国产设备也装载大量进口芯片及软件,无法得知是否存在安全隐患。由于软件产品的特殊性,软件产品的安全性很难定量衡量。虽然我国已制定《计算机信息系统安全保护等级划分准则》,但是对网络产品以及网络本身的安全性分析评估仍没有依据。因此安全性分析与评估已成为通信网络安全急需解决的关键技术。

    2.网络拓扑设计

    网络的拓扑设计是通过节点和链路的冗余与备份手段来提高通信网络系统的可用性与生存性。

    网络冗余通常用于出现故障时隔离故障,以避免全网失效。网络出现的故障可能是链路中断、节点失效等。网络冗余有多种实现方式。例如在传输网上通常采用环形结构,当出现节点失效或者链路中断时,SDH设备会在50ms之内倒换,绕开失效节点或者中断的链路,保障通信服务的可用性。在互联网上,通常采用网络设备双归属连接,出现节点失效或者链路失效时,动态路由协议会重新计算路由,在几十秒时间内恢复网络连通性。电话网在链路层依赖传输网的故障恢复,当节点出现故障时同样采用多路由机制绕开故障点。

    网络备份通常用于网络的防毁抗灾以及应急通信。当出现灾难或者重大事故时可以迅速启用备份设备、链路、网管中心乃至备份网络。网络备份通常代价较高,出于性价比考虑一般情况下运营商很难承受。通常在移动通信网中实现较多,如利用应急通信车架设临时基站,再使用微波等手段将临时基站连接到移动电话网。在911事件发生以后,美国空前重视网络防毁抗灾。纷纷考虑建设备份数据中心以及备份网管中心。备份网络的架构、备份中心的数据同步、组织以及切换仍有待研究。

    3.网络故障检测、保护倒换与故障恢复

    (1)故障检测

    故障检测是指网络出现故障时,网络运营者应当能通过故障检测机制及时获悉。传统电信网(如传输网)定义了比较丰富的开销字节,来及时获悉网络问题,例如误码或链路中断。因此传输网能够做到50ms内将中断的链路倒换到备份链路。ATM网络中同样设计了操作、管理和维护(OAM)信元,能够及时获悉发送链路或接收链路中断的情况。IP网络故障检测机制比较缺乏。例如以太网只能通过物理层信号得知接收链路连通性,或者由高层(例如IP层)通过因特网控制消息协议(ICMP)来检查网络层连通性。因此IP网以及互联网的故障检测机制是继续研究的关键技术。

    (2)保护倒换

    保护倒换源自传输网,功能是当传输网节点或者链路出现故障时,故障路径上的流量能够切换到事先指定的备用路径上,从而不影响业务运行。传输网络有成熟的保护倒换机制,能够在50ms内完成保护倒换。IP网上的保护倒换机制一般通过路由协议重新计算路径完成,需要较长时间,通常是10s量级。当然通过链路层负荷分担或者IP层多路径也可以做到不影响业务。当前多协议标记交换(MPLS)的快速重路由以及弹性分组环(RPR)的保护倒换机制也正向50ms指标靠近。

    (3)故障恢复

    故障恢复是指节点或者链路发生故障后经过一定时间或采取一定措施后恢复提供服务。通常故障恢复需要人工干预。例如接口板卡的更换、电缆的重新连接、设备的重新启动、软件重新运行等。也有少量故障会因时间或者随引发故障原因的消除而消除。例如当拥塞引起设备瘫痪时,如果限制接入业务,性能较好的设备可能能够恢复正常工作。

    4.信息传递安全技术

    (1)信息加密

    信息的机密性可以用传统的加密方式完成。最早的加密标准是美国的DES(DataENcryptIoNStaNDarD),但DES最初设计的56位密钥长度对于现在的运算能力来说已不难攻破,后来出现了三重DES算法加强了加密的强度。DES算法是对称加密算法,加密密钥也同时是解密密钥。与之相对有一些不对称的加密与解密算法,这些算法中加密与解密采用了不同的密钥,一个密钥专门用于加密,这个密钥可以让别人得到并用它对数据进行加密,而只有解密密钥持有者可以用解密密钥解开密文,并把它恢复成明文,这个加密体系称为公开密钥法。这个加密体系加密算法中最常用的是RSA算法与椭圆曲线密码算法,除此之外还有背包算法、RabIN密码算法、ElGamal密码算法、McElIece密码算法、LUC密码算法。

    对称加密算法与公开密钥算法是不同的两种密码体制,分别适于解决不同的问题。对称密码算法适合加密数据,它加密与解密速度极快并且对选择密文攻击不敏感。公开密钥密码可以做对称密码所不能做的事情,最擅长密钥分配和身份认证等对用户、密钥进行管理的工作。这部分内容将在后文中涉及到。

    在实际应用中,要进行保密通信的双方,先用公开密钥法交换彼此的加密密钥,得到这个加密密钥后,通信双方用对称加密法把信息加密后进行通信。

    (2)信息的鉴别与签名

    对数据加密可以保证信息不受到窃听,使用报文鉴别可以保证数据完整性,为保证数据的不可否认性则可以采用数字签名。报文鉴别的目的是:接收方保证这个报文没有被变动过。如果攻击者修改了报文却不知如何修改鉴别码,接收方收到报文后计算的鉴别码与收到的鉴别码不同,于是可以判定报文的内容受到破坏。

    用来生成鉴别码的算法很多,实际应用中大多采用的是单向散列函数。单向散列函数接受可变长报文输入,并产生固定长度的标签作为输出。由于单向散列函数的运算过程是不可逆的,好的散列算法输入不同报文生成相同标签的概率非常小,这使得篡改过的报文不被发现的可能性微乎其微。目前最常用的单向散列算法有MD5和SHA-1。

    单向散列生成固定长度的输出称为报文的摘要。报文的摘要就是要进行鉴别的内容,为了保证摘要的内容不可读取,应将报文的内容进行加密。加密时可采用公开密钥法。公开密钥法有两个优点:它不但可以对摘要进行加密,使报文可以进行鉴别,同时也提供了数字签名;而且采用公开密钥法不需要向通信各方用保密的方式传送密钥。

    公开密钥法所采用的密钥长度可到1024位,所以加密后的密文很难进行破解。公开密钥法的加密密钥持有者,用私有密钥对报文的摘要进行加密,报文的接收者收到报文后自己根据收到的报文计算出报文的摘要,再用公开密钥把发送者加密的摘要解密,如果两个结果一致就可以断定报文没有被第三方进行了篡改。

    在这一过程中,加密者用私有密钥对摘要进行加密,就是对报文进行数字签名。从数学上可以证明,私有的加密密钥只可以被其公开密钥解密,只要可以通过公开密钥把加密的内容无误地恢复成明文,加密者就不可否认他曾对此报文进行签名。

    (3)密钥的管理

    在传统的对称加密方法中通信双方加密解密用一把密钥,如果通信双方相隔很远,密钥的安全传送会成为一个很棘手的问题。而公开密钥法的出现可以很好地解决这个问题,公开密钥法解密的密钥是公开的,不需要用任何保密手段进行传送,通信的一方得到公开密钥对报文进行加密,报文只有私钥的持有者可以解开。但公开密钥算法加密的速度远比不上对称加密算法,因此实际应用中,常用公开密钥法在要进行保密通信双方间传递共享密钥,然后用对称加密法进行数据的加密。公开密钥法另一个用途就是上文中提到的数字签名。由于公开密钥法有如此强大的功能,对公开密钥进行管理就成为现代信息安全的一个重要课题。

    公开密钥的出现,对于信息安全的威胁变成了这样:当一个人声称他是A并提供了他的公开密钥,那么他真的就是A吗?目前采用的方法是通过第三方机构即认证中心(CA)对公开密钥进行认证。

    5.互联网安全技术

    (1)网络管理

    网管系统包括配置管理、故障管理、性能管理、安全管理和计费管理这5大部分,是维护网络可靠性和服务可用性可靠性的重要手段。通过强大的网络管理,可以有效地增强网络的健壮性。

    有这样一种说法:网络安全三分技术七分管理,该说法即使过于粗略也足见管理的重要性。传统的电信网网管能力较强,基本上做到了网元层次和网络层次的管理。但还没有实现服务管理(SM:ServIceMaNagemeNt)和商业管理(BM:BusINessMaNagemeNt)。同时传统电信网结构上采用外置式管理网,实现“以网管网”(以管理网管理运行网)的模式。互联网基本只能实现网元层的管理。相对来说网管能力较弱。

    (2)接入控制

    网络服务可控的网络必须对用户接入进行控制。传统电话网终端无智能,网络只区分接入端口。在互联网,由于终端具有智能性,IP地址可以在一定范围内随意改变。因此互联网对接入控制应当加以控制。

    (3)访问控制

    访问控制是保证网络安全的重要措施。访问控制可以使用防火墙在一定程度上得到实现。互联网国际出入口、与国内其他运营单位的互联点和企业网络的互联点,以及接入互联网的企业网络等网络边缘,要设置防火墙作为网络边缘的安全屏障,对网络的访问进行有效控制,其作用为:

    ·防止境外非法人员通过互联网进行恶意攻击或非法信息流入。

    ·减少互联网国际互联、内部网连接互联网的出口点。应确保组织内部网通过互联网与外部进行信息交换时,都必须经过防火墙。内部网对互联网名字的解析请求,必须送到防火墙的DNS,而不能绕过防火墙。

    ·提供合理有效的服务。互联网服务主要分为三大类,即电子邮件、FTP以及WWW。而对于其他TCP/IP服务,则应禁止穿透防火墙与INterNet通信。

    ·没有明确允许的信息流必须禁止通过防火墙。在进行需求分析以及防火墙设计时,必须遵循从小到大原则,即需要什么服务方可打开什么服务。然后,根据具体需要,逐步允许指定的信息流通过。

    ·对接入互联网的组织内部网的外部用户进行隔离,防止进入内部网。如果组织建立自己的互联网站点并允许外部用户访问,应将提供给外部用户访问的服务器放在防火墙外。绝对禁止外部互联网用户穿透防火墙访问组织内部网。利用防火墙提供的功能屏蔽内部网细节,阻止外部用户对内部资源的访问请求。.进行完整的审计和日志,及时发现侵入者。

    防火墙是一种被动防卫技术,由于它假设了网络的边界和服务,故防火墙对内部的非法访问难以有效地控制;防火墙最适合于相对独立的与外部网络互联途径有限、网络服务种类相对集中的单一网络。因此,应清醒地认识到防火墙不是万能的。

    (4)物理/逻辑隔离

    互联网是一个全球性的巨大的计算机网络体系,它把全球数万个计算机网络,数千万台主机连接起来,包含了难以计数的信息资源,向全世界提供信息服务,是开放范围极大的网络。互联网的开放性使其在任何时间、任何地点都可能遭受入侵。因此,既要保证互联网数据传输交换的畅通,又要求其具有较高的安全性。由于互联网是一个基于TCP/IP协议簇的国际互联网络,使其在安全保密方面具有很大的脆弱性,在互联网上对TCP/IP的攻击能够导致服务性能下降或中断、数据泄露或篡改。

    国家保密局2000年1月1日起颁布实施的《计算机信息系统国际联网保密管理规定》第二章保密制度第六条规定:“涉及国家秘密的计算机信息系统,不得直接或间接地与国际互联网或其他公共信息网络相连接,必须实行物理隔离。”所谓物理隔离是指内部网不直接或间接地连接公共网。物理隔离的目的是保护路由器、工作站、网络服务器等硬件实体和通信链路免受自然灾害、人为破坏和搭线窃听攻击。只有使内部网和公共网物理隔离,才能真正保证国家重要部门的内部信息网络不受来自互联网的黑客攻击。

    对于物理隔离技术而言,要使其真正地发挥优势,不仅要选择适合的物理隔离产品,制定相应的安全解决方案,真正做到物理上的隔离以保证信息的机密性和完整性,还要实施完善的安全策略和管理措施,才能保证物理隔离产品和安全解决方案的实施真正发挥作用。

    (5)网络防攻击

    由于互联网终端具有一定智能,并且提供多样化服务,所以互联网比较容易遭受攻击。互联网被攻击主要分几个层面,通常有控制层面的攻击、消耗网络资源的攻击以及对关键应用服务器的攻击。

    控制层面的攻击主要针对互联网不区分UNI接口和NNI接口,路由信息和数据在相同通道传输。为防止恶意用户试图发布错误路由信息来干扰全网连通性,通常采用路由协议鉴权和认证的手段。

    消耗网络资源的攻击主要采用病毒感染大量终端,致使大量无用信息在网络上传输,消耗网络带宽资源以及CPU资源。可能使设备拥塞、控制信息无法传递甚至系统崩溃。消耗资源型的攻击很难防止,必须采用有效的手段例如防火墙以及接入控制等措施防止消耗资源型的攻击。

    关键应用服务器的失效可能影响网络业务提供。对关键应用服务器的防护应纳入互联网防攻击的范围,应采用有效手段防止对关键应用服务器的攻击。

    (6)网络防病毒

    一般意义上来说,防病毒属计算机安全防护的范畴。病毒对网络的影响有下面三方面:

    ·网络设备和关键应用服务器受病毒感染,影响网络业务正常开展。

    ·用户设备受病毒感染,会滥用网络资源。

    ·病毒在网络上传播消耗网络资源。

    例如域名服务器被病毒感染可能导致无法使用域名访问互联网;门户网站被感染可能导致大量用户无法使用网络。用户设备被感染可能发送大量垃圾邮件,占用系统资源。当前大量病毒通过网络传染,因此防病毒也是网络安全关键技术。

    (7)入侵检测

    安全不是一个稳定的状态,不能一步到位。随着技术的发展,任何先进的防攻击手段都会过时,因此入侵检测是互联网安全重要组成部分。入侵检测和网络故障检测一样,需要及时迅速。及时的入侵检测加上快速的故障恢复,能有效地提高互联网安全性。

    (8)业务控制

    互联网的不安全性很大程度上来源于互联网业务的可控性较差。由于互联网业务通常不计费或者费率较低,用户容易自觉或者不自觉滥用网络资源。由于大多互联网业务很难追查来源,滥用服务的行为无法追查。又由于互联网业务很难确认用户身份,恶意用户肆无忌惮,因此要提高互联网安全性,必须加强业务可控性。

    (9)防止垃圾邮件

    垃圾邮件实际上是网络业务被滥用的一种。虽然防止垃圾邮件也是网络防攻击和业务控制的一部分,但是由于该问题日益严重有必要将其作为网络安全关键技术之一加以研究。

    垃圾邮件实际上与骚扰电话没有本质区别。区别在于打骚扰电话会被收费,而且会被追查到电话所有人;而发送垃圾邮件几乎没有费用,而且很难被追踪,即使被追查到也很难处理。此外,用户可能感染病毒后大量发送垃圾邮件,恶意发送与感染病毒无辜发送很难区别。

    当前防止垃圾邮件没有非常有效的技术,只能通过各运营商的合作,通过管理手段加以缓解。

    虽然本文提出大量通信网络安全的技术问题,但是网络的安全问题的核心和瓶颈不是在于技术而是在于管理和投入。通信网络安全问题不是一朝一夕就能够完全解决的。目前解决网络安全问题的大部分技术是存在的,但是如何把这些技术综合起来,还存在很多问题。解决通信网络安全问题的难度很大,需要继续进行理论上的研究和在试验环境下进行实际测试来验证,才能在一定程度上解决网络的安全问题。

    作者简介:魏亮信息产业部电信研究院通信标准研究所副总工程师

怎样查找对方的IP地址(转)

与好友在网络上相互传输资料时,有时先要知道对方计算机的IP地址,才能与对方建立信息传输通道;那么对方的IP地址该如何搜查得到呢?这样的问题你也许会嗤之以鼻,的确,查询对方计算机的IP地址,实在简单得不值得一提;可是,要让你列举出多种IP地址搜查方法时,你可能就感到勉为其难了。下面,本文就对如何快速、准确地搜查出对方好友的计算机IP地址,提出如下几种方法,相信能对大家有所帮助!

  1、邮件查询法

  使用这种方法查询对方计算机的IP地址时,首先要求对方先给你发一封电子邮件,然后你可以通过查看该邮件属性的方法,来获得邮件发送者所在计算机的IP地址;下面就是该方法的具体实施步骤:

  首先运行OutLook express程序,并单击工具栏中的“接受全部邮件”按钮,将朋友发送的邮件接受下来,再打开收件箱页面,找到朋友发送过来的邮件,并用鼠标右键单击之,从弹出的右键菜单中,执行“属性”命令;

  在其后打开的属性设置窗口中,单击“详细资料”标签,并在打开的图1标签页面中,你将看到“Received: from xiecaiwen (unknown [11.111.45.25])”这样的信息,其中的“11.111.45.25”就是对方好友的IP地址;当然,要是对方好友通过Internet中的WEB信箱给你发送电子邮件的话,那么你在这里看到的IP地址其实并不是他所在工作站的真实IP地址,而是WEB信箱所在网站的IP地址。 

  当然,如果你使用的是其他邮件客户端程序的话,查看发件人IP地址的方法可能与上面不一样;例如要是你使用foxmail来接受好友邮件的话,那么你可以在收件箱中,选中目标邮件,再单击菜单栏中的“邮件”选项,从弹出的下拉菜单中选中“原始信息”命令,就能在其后的界面中看到对方好友的IP地址了。

 2、日志查询法

  这种方法是通过防火墙来对QQ聊天记录进行实时监控,然后打开防火墙的日志记录,找到对方好友的IP地址。为方便叙述,本文就以KV2004防火墙为例,来向大家介绍一下如何搜查对方好友的IP地址:

  考虑到与好友进行QQ聊天是通过UDP协议进行的,因此你首先要设置好KV2004防火墙,让其自动监控UDP端口,一旦发现有数据从UDP端口进入的话,就将它自动记录下来。在设置KV2004防火墙时,先单击防火墙界面中的“规则设置”按钮,然后单击“新建规则”按钮,弹出图2所示的设置窗口;


  在该窗口的“名称”文本框中输入“搜查IP地址”,在“说明”文本框中也输入“搜查IP地址”;再在“网络条件”设置项处,选中“接受数据包”复选框,同时将“对方IP地址”设置为“任何地址”,而在“本地IP地址”设置项处不需要进行任何设置;

  下面再单击“UDP”标签,并在该标签页面下的“本地端口”设置项处,选中“端口范围”选项,然后在起始框中输入“0”,在结束框中输入“65535”;同样地,在“对方端口”设置项处,也选中“端口范围”选项,然后在起始框中输入“0”,在结束框中输入“65535”。

  接着在“当所有条件满足时”设置项处,选中“通行”选项,同时将“其他处理”处的“记录”选项选中,而“规则对象”设置项不需要进行任何设置;完成了上面的所有设置后,单击“确定”按钮,返回到防火墙的主界面;再在主界面中选中刚刚创建好的“搜查IP地址”规则,同时单击“保存”按钮,将前面的设置保存下来。

  完成好上面的设置后,KV2004防火墙将自动对QQ聊天记录进行全程监控,一旦对方好友给你发来QQ信息时,那么对方好友的IP地址信息就会自动出现在防火墙的日志文件中,此时你可以进入到KV2004防火墙的安装目录中,找到并打开“kvfwlog”文件,就能搜查到对方好友的IP地址。#

3、工具查询法

  这种方法是通过专业的IP地址查询工具,来快速搜查到对方计算机的IP地址。例如,借助一款名为WhereIsIP的搜查工具,你可以轻松根据对方好友的Web网站地址,搜查得到对方好友的IP地址,甚至还能搜查到对方好友所在的物理位置。在用WhereIsIP程序搜查对方IP地址时,首先启动该程序打开如图3所示的搜查界面,然后单击该界面的“Web site”按钮,在其后的窗口中输入对方好友的Web地址,再单击“next”按钮,这样该程序就能自动与Internet中的Domain Name Whois数据库联系,然后从该数据库中搜查到与该Web网站地址对应的IP地址了。当然,除了可以知道IP地址外,你还能知道对方好友所在的具体物理位置。


  倘若要想查看局域网中某个工作站的IP地址时,可以使用“网络刺客II”之类的工具来帮忙;只要你运行该工具进入到它的主界面,然后执行工具栏中的“IP地址<->主机名”命令,在其后打开的对话框中,输入对方好友的计算机名称,再单击“转换成IP”按钮,就能获得对方好友所在计算机的IP地址了。

  如果你使用Oicqsniffer工具的话,那么查询QQ好友的IP地址就更简单了。只要你单击该程序界面中的“追踪”按钮,然后向对方好友发送一条QQ消息,那么Oicqsniffer工具就会自动将对方好友的IP地址以及端口号显示出来了。除此之外,还有许多可以查找IP地址的专业工具可以选择,例如IPsniper软件

 

4、命令查询法

  这种方法是通过Windows系统内置的网络命令“netstat”,来查出对方好友的IP地址,不过该方法需要你先想办法将对方好友邀请到QQ的“二人世界”中说上几句话才可以。下面就是该方法的具体实现步骤:

  首先单击“开始”/“运行”命令,在弹出的系统运行对话框中,输入“cmd”命令,单击“确定”按钮后,将屏幕切换到MS-DOS工作状态;然后在DOS命令行中执行“netstat -n”命令,在弹出的图4界面中,你就能看到当前究竟有哪些地址已经和你的计算机建立了连接(如果对应某个连接的状态为“Established”,就表明你的计算机和对方计算机之间的连接是成功的);


  其次打开QQ程序,邀请对方好友加入“二人世界”,并在其中与朋友聊上几句,这样你的计算机就会与对方好友的计算机之间建立好了TCP连接;此时,再在DOS命令行中执行“netstat -n”命令,看看现在又增加了哪个tcp连接,那个新增加的连接其实就是对方好友与你之间的UDP连接,查看对应连接中的“Foreign Address”就能知道对方好友的IP地址了。

  5、ping检查法

  这种方法就是利用“ping”命令,来检查当前计算机是否能与对方好友的网站连通,在检查的过程中该地址能自动获得对方网站的IP地址。比方说,要是你想搜查天极网站的IP地址时,可以先打开系统的运行对话框,然后在其中输入“ping www.yesky.com”字符串命令,再单击“确定”按钮,在弹出的图5窗口中,就能知道天极网站的IP地址为“219.239.88.68”了。同样地,你也可以搜查其他网站的IP地址。

如何删除系统中顽固文件的十二招技巧(转)

 

  1、注销或重启后,再删;

  2、进入安全模式或用启动软盘(光盘)启动进入纯DOS,删除;

  3、如果是删除文件夹,从里往外删,即先进入该文件夹,删除里面所有内容,然后再返回上一层目录,删除该文件夹;

  4、用Windows优化大师等的文件粉碎机删除;

  5、Win2000/XP系统以管理员身份登录,再执行删除操作;

  6、如果系统是WinXP,关闭系统还原,再删;

  7、对于大文件,特别是压缩包文件,关闭杀毒软件的实时监控后,再删;

  8、注销掉预读功能再删,方法:开始→运行,输入regsvr32 /u shmedia.dll,确定。重启后再删。完了再运行一下regsvr32 shmedia.dll,恢复注册;

  9、用WinRAR删除,打开WinRAR,点“添加”,选中要删除的文件,在“设置”下点选“压缩后删除源文件”,压缩完成后把压缩文件也删除。

  10、先对该文件所在分区进行磁盘扫描,扫描前选中“自动修复文件和扇区”,完成后再删;

  11、打开命令提示符窗口,然后再打开任务管理器,结束“Explorer.exe”进程,在命令提示符窗口进入该文件所在目录,用Del命令删除,完了在任务管理器中点“文件”→新建任务→浏览→找着C:\WINDOWS\Explorer.exe,点“确定”即可;

  12、Win2000/XP系统,清除页面文件再删除。方法:系统属性→高级→性能设置→高级→虚拟内存更改→把页面文件大小设为“无分页文件”,重启后进行删除。然后恢复原来的页面文件。

绝对经典 C++初学者必看的50个建议 !(转)

  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++!

学编程前必须看的东西(左天翼)

1、扎实的基础
  数据结构、离散数学、编译原理,这些是所有计算机学科的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。
2、丰富的想像力
  不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。
3、最简单的是最好的
  这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4、不钻牛角尖
  当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5、对答案的渴求
  人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6、多与别人交流
  三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7、良好的编程风格
  注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
8、韧性和毅力
  这也许是“高手”和一般程序员最大的区别。高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。

深入理解C语言指针的奥秘(转)

指针的概念

  指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。  先声明几个指针放着做例子:

  例一:

  (1)int*ptr;

  (2)char*ptr;

  (3)int**ptr;

  (4)int(*ptr)[3];

  (5)int*(*ptr)[4];

  如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c ++的复杂类型声明>>。

  指针的类型

  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:

  (1)int*ptr;//指针的类型是int*

  (2)char*ptr;//指针的类型是char*

  (3)int**ptr;//指针的类型是int**

  (4)int(*ptr)[3];//指针的类型是int(*)[3]

  (5)int*(*ptr)[4];//指针的类型是int*(*)[4]

  怎么样?找出指针的类型的方法是不是很简单?

  指针所指向的类型

  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。

  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:

  (1)int*ptr;//指针所指向的类型是int

  (2)char*ptr;//指针所指向的的类型是char

  (3)int**ptr;//指针所指向的的类型是int*

  (4)int(*ptr)[3];//指针所指向的的类型是int()[3]

  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]

  在指针的算术运算中,指针所指向的类型有很大的作用。

  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
  指针的值,或者叫指针所指向的内存区或地址

  指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

  指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。

  以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?

  指针本身所占据的内存区

  指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。

  指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

  指针的算术运算

  指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:

  例二:

  1、chara[20];

  2、int*ptr=a;

  ...

  ...

  3、ptr++;

  在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。

  我们可以用一个指针和一个循环来遍历一个数组,看例子:

  例三:

intarray[20];
int*ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
 (*ptr)++;
 ptr++;
}

  这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。

  再看例子:

  例四:

  1、chara[20];

  2、int*ptr=a;

  ...
  ...

  3、ptr+=5;

  在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

  如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

  总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

  一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

  运算符&和*

  这里&是取地址运算符,*是...书上叫做"间接运算符"。

  &a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。

  *p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

  例五:

inta=12;
intb;
int*p;
int**ptr;
p=&a;
//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。
*p=24;
//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。
ptr=&p;
//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int **。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。
*ptr=&b;
//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。
**ptr=34;
//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。

  指针表达式

  一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表式。

  下面是一些指针表达式的例子:

  例六:

inta,b;
intarray[10];
int*pa;
pa=&a;//&a是一个指针表达式。
int**ptr=&pa;//&pa也是一个指针表达式。
*ptr=&b;//*ptr和&b都是指针表达式。
pa=array;
pa++;//这也是指针表达式。

  例七:

char*arr[20];
char**parr=arr;//如果把arr看作指针的话,arr也是指针表达式
char*str;
str=*parr;//*parr是指针表达式
str=*(parr+1);//*(parr+1)是指针表达式
str=*(parr+2);//*(parr+2)是指针表达式

  由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

  好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

  在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

  数组和指针的关系

  如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章<<如何理解c和c++的复杂类型声明>>。

  数组的数组名其实可以看作一个指针。看下例:

  例八:

intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成:value=*array;
value=array[3];//也可写成:value=*(array+3);
value=array[4];//也可写成:value=*(array+4);

  上例中,一般而言数组名array代表数组本身,类型是int[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int*,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

  例九:

char*str[3]={
 "Hello,thisisasample!",
 "Hi,goodmorning.",
 "Helloworld"
};
chars[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

  上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char*。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char*。

  *(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向 "Hi,goodmorning."的第一个字符'H',等等。

  下面总结一下数组的数组名的问题。声明了一个数组TYPEarray[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

  在不同的表达式中数组名array可以扮演不同的角色。

  在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。

  表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。

  例十:

intarray[10];
int(*ptr)[10];
ptr=&array;

  上例中ptr是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

  本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:

int(*ptr)[10];

  则在32位程序中,有:

sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4

  实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。

  指针和结构类型的关系

  可以声明一个指向结构类型对象的指针。

  例十一:

structMyStruct
{
 inta;
 intb;
 intc;
}
MyStructss={20,30,40};
//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct*ptr=&ss;
//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。
int*pstr=(int*)&ss;
//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

  请问怎样通过指针ptr来访问ss的三个成员变量?

  答案:

ptr->a;
ptr->b;
ptr->c;

  又请问怎样通过指针pstr来访问ss的三个成员变量?

  答案:

*pstr;//访问了ss的成员a。
*(pstr+1);//访问了ss的成员b。
*(pstr+2)//访问了ss的成员c。

  虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:

  例十二:

intarray[3]={35,56,37};
int*pa=array;

  通过指针pa访问数组array的三个单元的方法是:

*pa;//访问了第0号单元
*(pa+1);//访问了第1号单元
*(pa+2);//访问了第2号单元

  从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。

  所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导致各个成员之间可能会有若干个字节的空隙。

  所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。

  通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。

  指针和函数的关系

  可以把一个指针声明成为一个指向函数的指针。

intfun1(char*,int);
int(*pfun1)(char*,int);
pfun1=fun1;
....
....
inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。

  可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。

  例十三:

intfun(char*);
inta;
charstr[]="abcdefghijklmn";
a=fun(str);
...
...
intfun(char*s)
{
intnum=0;
for(inti=0;i{
num+=*s;s++;
}
returnnum;
}

  这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。
  指针类型转换

  当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。

  例十四:

  1、floatf=12.3;

  2、float*fptr=&f;

  3、int*p;
 
  在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?

  p=&f;

  不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行"强制类型转换":

p=(int*)&f;

  如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*TYPE, 那么语法格式是:

  (TYPE*)p;

  这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。

  一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。

  例十五:

voidfun(char*);
inta=125,b;
fun((char*)&a);
...
...
voidfun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
}

  注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp, 然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。

  我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:

unsignedinta;
TYPE*ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制

ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)

  编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:

unsignedinta;
TYPE*ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a;//呵呵,这就可以了。

  严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。

  想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完 全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:

  例十六:

inta=123,b;
int*ptr=&a;
char*str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。

  现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。

  指针的安全问题

  看下面的例子:

  例十七:

chars='a';
int*ptr;
ptr=(int*)&s;
*ptr=1298;


  指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。

  让我们再来看一例:

  例十八:

  1、chara;

  2、int*ptr=&a;

  ...
  ...

  3、ptr++;

  4、*ptr=115;

  该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。

  在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一想,应该会明白的。

如何选择适合自己的开发工具(转)

随着计算机技术不断发展,各种数据库编程工具也随着发展,使当今的大多数程序开发人员可以摆脱枯燥无味的用计算机指令或汇编语言开发软件,而是利用一系列高效的、具有良好可视化的编程工具去开发各种数据库软件,从而达到事半功倍的效果,但是现在市面上的数据库编程工具门类众多,优良不齐,比如VB、PB、DELPHI、C++ Builder、VC、JAVA等。这样,对于学生来说选择一个适合自己的开发工具就显得尤为重要了。选择是建立在了解、对比和思考基础上的,那么我们先来了解一下各类开发工具。
(一)几种常用的数据库开发工具比较:
     VB,全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。在中国乃至全世界都曾看到过它的身影,它曾是在中国最为流行的编程工具,到现在还占据着非常重要的地位,对于它的好坏大家都有一定的了解,VB作为一种较早出现的开发程序以其容易学习,开发效率较高,具有完善的帮助系统等优点曾影响了好几代编程人员,但是由于VB不具备跨平台这个特性,从而也决定了VB在未来的软件开发中将会逐渐地退出其历史舞台;它对组件技术的支持是基于COM和ActiveX,对于组件技术不断完善发展的今天,它也显出了它的落后性;同时VB在进行系统底层开发的时候也是相对复杂的,调用API函数需声明,调用不方便,不能进行DDK编程,不可能深入Ring0编程,不能嵌套汇编;而且面向对象的特性差;网络功能和数据库功能也没有非常特出的表现。可见,VB作为一种可视化的开发工具由于其本身的局限性,导致了它在未来软件开发中逐步被其他工具所代替。但VB仍是新人开发与系统无关的综合应用程序的首选;容易使用和厂商财力很强是其仅有的两点优势。VB开发效率高,代码执行效率一般,但是入门和学习速度快,有较好的学习氛围和帮助书籍和帮助文档。但是随着微软的.NET技术的推广,VB将会逐渐退出历史舞台。
     PB,全称PowerBuilder,是开发MIS系统和各类数据库跨平台的首选,使用简单,容易学习,容易掌握,在代码执行效率上也有相当出色的表现。PB是一种真正的4GL语言(第四代语言),可随意直接嵌套SQL语句返回值被赋值到语句的变量中,支持语句级游标,存储过程和数据库函数,是一种类似SQLJ的规范,数据访问中具有无可比拟的灵活性。但是它在系统底层开发中犯了跟VB一样的错误,调用API函数需声明,调用不方便,不能进行DDK编程,不可能深入Ring0编程,不能嵌套汇编;在网络开发中提供了较多动态生成Web页面的用户对象和服务以及系统对象,非常适合编写服务端动态Web应用,有利于商业逻辑的封装;但是用于网络通讯的支持不足,静态页面定制支持有限,使得PB在网络方面的应用也不能非常广泛并且面向对象特性也不是太好。PB最大的优势就是Datawindow技术的成熟和方便,他成为PB与其他数据库开发工具抗衡的资本。同时PB在对JAVA和WEB,以及面向对象方面的发展也可以预见PB将成继续成为数据库系统(特别是MIS系统)开发工具的首选。同时PB的强大帮助文档也为初学者提供了入门基础,PB连接数据库的自由和方面也为PB的提供了方便,同时PB对API的调用以及对报表的处理强大。但是PB的高级编程书籍的缺乏和基础语言PowerScript的普及程度对PB的明天有一定的限制。
     DELPHI/ C++Builder它们都是基于VCL库的可视化开发工具,它们在组件技术的支持、数据库支持、系统底层开发支持、网络开发支持、面向对象特性等各方面都有相当不错的表现,并且学习使用较为容易,充分提现了所见即所得的可视化开发方法,开发效率高。由于两者都是Borland 公司的产品,自然继承了该公司一贯以来的优良传统:代码执行效率高。但是,它们并不是毫无缺点,它们所作的最大不足之处就是他们的帮助系统在众多的编程工具中是属于比较差的。C++Builder的VCL库是基于Object pascal(面向对象pascal),使得C++Builder在程序的调试执行上都面向落后于其他编程工具。而Delphi则是它的语言不够广泛,开发系统软件功能不足两个比较大的缺点。是唯一一套能够同时适用于开发数据库应用、网络及Web应用、分布式应用、可重用组件、系统软件、驱动程序、多媒体及游戏等所有软件的高效率开发环境;VCL源码基于Object Pascal是C++ Builder 唯一的缺憾,基础语言不够通用和开发系统软件功能不足是Dephi仅有的两点不足.
     Visual C++,是基于MFC库的可视化的开发工具,从总体上说它是一个功能强大但是不便使用的一种工具。它在网络开发和多媒体开发都具有不俗的表现,帮助系统也做得非常不错(Microsoft 在细节方面的处理往往都让人觉得亲切),但是虽然是使用C++作为基本语言,但是它在面向对象特性上却不够好,主要是为了兼容C的程序,结果顾此失彼;在组件支持上也不太好,虽然说除了支持COM,ActiveX外还支持CORBA,但是没有任何IDE支持,是所有C编译器的功能, 需要CORBA中间件支持;最大的问题是开发效率也不高。从功能上讲除了跨平台应用外什么都可开发;从开发效率角度讲只局限于开发windows系统应用、可重用组件及驱动程序。 又因为有微软的支持,其自身的基础语言的普及程度高,以及其代码的执行效率高等特性、VC自带强大帮助文档和大量优质教材,VC在数据库开发工具中始终可以稳住阵角。
     JAVA工具,目前比较出名的是Borland出的JBuilder和IBM出的Visual Age for Java,两种工具都有一定数量的是用人群。JBuilder继承了C++Builder/Delphi的特点,在可视化上做得非常不错,使用简便。由于Java本身语言的特点使得他们在网络开发中具有高人一等的表现,而且面向对象特性高,支持的组件技术也非常多,跨平台的特性也使得它在现在和未来的开发中占据越来越重要的地位。但是在系统底层开发和多媒体开发中却表现得并不让人那么满意,这个可能跟设计Java的意图有关吧。适用于开发除了系统软件、驱动程序、高性能实时系统、大规模图像处理以外所有的应用。在一般的管理信息系统中和一般的数据库开发中,很少有人会选择JAVA,一是由于其开发环境的配置较难,已经和数据库连接时较为负责,对开发人员的开发经验和学习时间都要很高要求,所以对于经验不是很丰富的开发人员一般是不选择JAVA,但是JAVA的强大网络功能和真正的面向对象特性决定了JAVA的未来,JAVA将在一个较为长期的时段里可以与微软家族抗衡。
(二)选择合适开发工具的几点建议
    古语云:工欲善其事,必先利其具。通过上面几种开发工具的分析、对比,我们就可以开始着手选择一种适合自己的开发工具了。如何选择开发工具呢?一般应遵循以下几个规则:
1.如果你的程序基本上完全是数据录入、查询、汇总、打印等,性能要求高,打算使用C/S结构,那么PowerBuilder的确是不错的选择。
2. 如果数据库要求不高,只是本地的,对于用户界面、通信、多媒体等方面有要求,那么我觉得VB、VC、Delphi更好。我个人不太喜欢BDE,主要是分发和建立别名比较麻烦。
3.一旦你确定了基本使用的语言,那么采用什么方式也就定下来。如对于VC、VB,访问本地数据库一般为DAO,访问服务器上数据库一般使用。ODBC/RDO/ADO。我在访问本地数据库一般不使用ADO,主要是在配置比较低的机器上速度比较慢,不过DAO迟早要被ADO取代。
4.同时结合MS SQL或是My SQL的其他功能,比如触发器,存储过程,视图等。
     希望这篇文章对学习程序设计的朋友有一定的帮助!

写给想当程序员的朋友(转)

谨以此文献给所有想当程序员的朋友

(一) 文章由来及个人经历

我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考虑一下这个问题了,来帮助朋友选择和回报朋友的信任。

这也就是此文的由来。

还是先谈谈我个人的经历吧。(是不是有点俗套,但我觉得了解我的经历,有助于理解我话的含义;我一向认为不了解古龙的生活经历的,不会真正读懂古龙的作品和古龙笔下的英雄的)我本科就读于南方一所著名的高校(因为自己的不成气,愧谈母校名谓),学的就是计算机专业。上本科时,几乎没有认真的听完一门专业课程,上课看报纸睡大觉,下课看录像看小说看球赛,临考抱佛脚,每次考试和课程设计都是蒙混过关。(于之相对是,我选修的工商管理和经济贸易方面的课到是听得不亦乐乎,考的分数颇高,也许这才是我的真正兴趣所在。)

总而言之,大学是混过来了,对专业的理解和掌握程度,应该没有达到毕业要求的合格水平。(也很后悔,但是有什么用呢,当时不知道珍惜;如果上天再给我一次机会的话,我一定会抓住,多看点美国大片少看点港片;现在,重回校园是我的一大理想)但是大学的学习使我有了一个简单的知识框架(总算学费没白交),我对一个朋友这样形容过我的这个知识框架,“它不是钢筋铸的,是稻草扎的”,哈哈哈,不要笑,真的,我敢说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在,我一直觉得自己的基础知识还是很薄弱,一直想抓点时间,把基础书本好好的温习一下。(此项任务正在计划和实施中)

毕业后,分配到某研究所工作。当领导让我选择自己以后的工作方向时,我毫不犹豫的选择了软件(也不知道到底是对还是错,但我决不后悔)。此研究所主要是以硬件为核心搞通信控制设备的研发生产;软件是辅助,所以也不受什么重视,很多搞软件的人都跳槽走了,留下来的大都是一些已经废掉和行将废掉的“伪/萎”程序员(名副其实的“软件人员”)。在这里感觉不到什么高紧张和高技术程度的研究和开发;软件开发的技术含量极低,以致于大部分人只有半年的学习和开发经验,以后都是这些知识和经验的重复利用。(我问过其他到研究所工作的同学,他们说都一样,呜呼,我们的国防科研开发呀)对于软件的开发,领导的意志和老掉牙的经验在新课题的技术采用和开发中起了决定性作用,没有明确的需求,没有明确的开发计划和进度,大家在一天一天一周一周的浪费着宝贵的时间,最后开发出来的东西修来改去,直至它变成垃圾。 我越来越认识到一点,要么象那些废人一样废掉,要么自己去努力寻求出路,反正别指望从工作中得到什么高明的经验了(教训倒也许有)。期间发生了一些感情上的纠纷,严重的影响了学习计划和效果,直到现在浮躁的心仍然有些浮躁。

期间,我读了一些书,看了一些文章,编过一些小例程,搞了一些没有什么技术含量的开发工作,也和一些前辈和高手们谈过聊过。 我一直在思考几个问题;如何学习软件开发?如何搞软件开发,国外的软件开发到底其秘诀在何处?为何我们的软件业一直在低水平徘徊?我们难道真的离了Microsoft就活不了?我们的程序员到底在浪费时间干些什么?软件开发到底是如何分类的?我们如何走自己的民族软件之路?

我想了很久,一些想通了,一些还在想。但我知道有一点是肯定的,那就是我们一定要靠我们自己走出自己的软件之路!跟在别人屁股后面永远受制于人!

好了,关于经历和牢骚就先写这些吧,该进入我们的正题了。


(二) 你适合当程序员吗,你知道编程序是怎么回事吗?


1、 程序员意味着要编程序。(如果你仅仅想得到一份高薪水的工作,喝喝咖啡就等老板发薪水,我奉劝你还是另找一份更合适的工作,譬如练摊,真的,兄弟,这份工作不适合你)

2、你是学文的还是学理的,编程序也许需要浪漫,但更需要逻辑和严谨。(说坦白点就是,在你没有找到乐趣以前,它很枯燥)

3、你有对新技术追求的热情吗?你有刨根问底的探索精神吗?(热情绝对是最重要的!你仔细思考一下自己的性格适合当程序员吗?)

4、当程序员决不是什么好差事,时刻需要学习,需要思考。(直到你成为那个可以引导别人去学习和思考的人,你才可以偷偷的嘿嘿笑,又一群傻蛋)

5、程序员的未来很迷茫。(但我认为关键看你自己!我希望你是一个有追求的人,不仅仅是混碗饭吃。因为真正的乐趣在于创造;如果你能改变软件业的历史,那才是英雄;不想成为Bill Gates,不想成为Dennis Ritchie和 Bjarne Stroustrup,我会说你没有追求。有个关于程序员未来的笑话,也许你还没听过,你该听一听,摘抄如下:

一个程序员对自己的未来很迷茫,于是去问上帝。
“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的”
于是他去问Lippman。
Lippman说“程序员的未来就是驾驭程序员”
这个程序员对这个未来不满意,于是他又去问上帝。
“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的”
于是他去问Gates。
Gates说“程序员的未来就是榨取程序员”
这个程序员对这个未来不满意,于是他又去问上帝。
“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝说“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的”
于是他去问侯捷。
侯捷说“程序员的未来就是诱惑程序员”
这个程序员对这个未来不满意,于是他又去问上帝。
“万能的上帝呀,请你告诉我,我的未来会怎样?”
上帝摇摇头“唉,我的孩子,你还是别当程序员了”)

6、当程序员还是很有乐趣的。(当你学到新知识时,当你有新的思想见解时,当你有新的产品问世时,和知己探讨你的成果时…我问你,觉得这些是乐趣吗?)

7、当程序员不易也不难。(世间事有难易乎?为之…;不为…。你有决心和信心吗?)

8、你真的要当程序员?是你自己的想法?

9、你舍得花钱买书吗?(读好书绝对是学习编程的最佳捷径。你一定会说,现在电脑书籍真他XX的贵,没法子,谁让知识和技术在人家的脑袋,在人家的书里呢;等你写书时可以把价格定低一点,记着还有好多没钱但想买书的兄弟很困难呀。要舍得买书,买好书,不好的的书不如不读,其害大于其益,关于买什么书,你可以问高手或看候捷的书评;准备一个小本子记录你想买的书的名字,逛书店时看看,如果好就买下,记住要读,别光买不看。) 10、我告诉你,程序就是:任何有目的的、预想好的动作序列,它是一种软件。

11、编程序就是编写程序。

12、你想好了吗?(如果你想好了还是决定要当程序员,可以继续往下读;否则,你可以继续寻找别的出路了。)

(三) 一个程序员应该具备的基础知识和概念

1、计算机是有什么组成的,CPU是什么东西,其工作原理是什么。(对于这些以及下面将要提到的概念我不会告诉你什么答案,你可以看相应的教材,关于教材我会在下一部分详述,记住理解最重要!)

2、机器语言和微指令集的概念。

3、程序的概念。

4、汇编语言是低级语言但不是机器语言。

5、高级语言主要有那些?(C,C++,Basic,Pascal,Fortran,C#,Java等等;如果你是中国软件业的英雄,你也写一门语言,最好不用英语) 6、编译程序和解释程序的概念和其原理。(编译器是高手和专家编写的)

7、HTML、XML等是标识性语言。

8、Prolog是人工智能语言。

9、操作系统OS的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是OS,还有一些实时OS,嵌入OS,编这些的绝对是高手)

10、Windows编程说白了就是Windows API的调用。(中国的程序员很多只是会编windows程序,用的是VB,我的建议是这些程序员顶多只是低级编码员,我称其是coder)

11、VC++、VB、BC、BCB、Delphi、VF等都只是编程的工具和环境,不是编程语言。

12、面向结构的设计概念。

13、面向对象的概念。(好好理解,兄弟,这个东西还是很重要的)

14、软件工程的概念和原理。(如果你想当老总就需要好好研究了,系统分析员比编码员要高一个等级,薪水也高哟)

15、数据库的概念。(要熟悉一些著名的数据库系统和语言的名字,如Orcle,SQL,DB2,DyBase等)

16、了解网络概念。

17、了解多媒体概念。

18、熟悉和掌握数据结构和基本算法。

19、是不是要求太高了,别着急慢慢来,进步在不知不觉之中。(一旦开始学习,一个月以后你就会有一个基本的概念;两个月以后你就会感觉自己有了全面的基础知识;当你知道编程序是怎么回事时,说明你已经入门了。也有很多人编了很多年程序还没有入门呢,你不会希望自己步其后尘吧。要有信心和耐心。沉不住气怎么能成大事?!)
(四) 教材推荐

――-推荐的教材主要还是针对概念来的,最好选用名校的教学用书。

1、《计算机组成原理》(熟悉)

2、《数据结构》(掌握)

3、《操作系统》(了解->熟悉)

4、《The C language》(掌握)

5、《编译原理》(了解原理)

6、《汇编语言》(了解)

7、《计算机网络》(了解)

8、《软件工程》(了解)

9、《关系数据库》(熟悉)

10、《The C++Languege 》(掌握)

11、《面向对象设计》(掌握;结合C++学习)


(五)一些经验和体会

1、真正的程序员用C++;(一位专家说的)

2、动手去编程序;

3、动脑去思考;

4、要有良好的编程风格;

5、读书,读好书,尽量读原版书!(我反复强调这一点,读书要有选择,坚持读好书,名家出的经典书,不要浪费实践在一些粗制滥造的书上面;坚持博览群书)

6、有自己的学习计划;

7、总结自己的经验教训;(准备一个笔记本,记录错误和心得)

8、不要怕学新东西;

9、要有软件工程的思想;

10、善于发现问题,然后去寻找答案;

11、向高手请教;(要虚心直到你成为高手)

12、和同行交流;(不善于交流肯定不行)

13、懂得软件的实质,不要被千变万化的表象所迷惑;

14、真正要学习用的是编程语言和方法,不是什么库,什么类,什么工具;(学用那些什么库都比较简单,但光会这些库,我觉得还远远不够)

15、学习wiodows编程主要是学习windows OS和win32 API;

16、有空了解一下嵌入式开发;

17、有空了解一下PDA软件开发;

18、了解一下.NET框架和C#语言,也许它是你新的衣食父母;

19、要有耐心,不要作浮躁的人; 20、对程序加注释,并保留你的老程序;

21、学到的东西越多,了解的越多,你就越接近专家;

22、有空去逛逛CSDN,那里有你很多知己;

23、要有信心成为一个优秀的程序;

(六)一些好书的推荐

1、《The C Programming language》 (Keinighan & Dennis Ritchie 1988)

2、《The C++ Programming Languague》(Bjarne Stroustrup 1997)

3、《Inside The C++ Object Model》 (lippmans)

4、《Effective C++》 (同上)

5、《More Effective C++》 (同上)

6、《Exceptional c++》

7、《C++面向对象高效编程》

8、《设计模式》

9、《Thinking In C++》

10、《The Standard C++ Bible》(一般推荐)

11、《The Art of Computer Programming 》

12、《Programming Windows》 (Charles Petzold)

13、《VC++5.0技术内幕》

14、《MFC 深入浅出》

15、《软件需求》

16、《Advanced Windows》

17、《C++ primer》

18、《win32程序员参考手册》

19、《用TCP/IP进行网际互连》

20、《COM 本质论》

(七)学习计划

――-这个学习计划是我个人定的,也共享给大家参考一下,共同进步吧。 1、《计算机组成原理》

2、《操作系统》

3、《数据结构》

4、《汇编语言》

5、《 C 》

6、《 C++ 》

7、《VC 技术内幕》

8、《Programming Windows》

9、《深入浅出MFC》

10、《Advanced Windows》

11、《Inside The C++ Object Model》

12、《Thinking in C++》

13、《Effective C++》

14、数据库

15、网络

16、嵌入式OS和编程

17、硬件单片机

18、.NET和C#

19、软件工程

20、UNIX和Linux


(八)后记

一年来浪费了大量的时间去摸索,去思考,走了很多的弯路,直到现在我还觉得自己是个编程的门外汉。我把我的一些体会和想法说出来(当然,很多都不一定正确,欢迎大家指正和讨论),也许对一些想加入程序员行列的朋友有一些建议和帮助。希望能帮助这些朋友顺利走上编程之路,成为高手。

如果真能如此,我也就很高兴了。欢迎有兴趣的朋友给我发E_mail(sjpsky@163.net);我这个人有两大业余爱好,其一就是读武侠小说,其二就是结交英雄侠士。

后记:此文我用analyster的名字登录,发表在“csdn-程序人生”上了,有很多网友看了,回了,还收到几个网友发来邮件,和我探讨,我很感谢大家对我的信任和鼓励。

我要说明的就是我的这篇小文,主要是想给“一些想成为程序员”的朋友一些建议,帮他们寻找一条自我培训的捷径,(其实世界上没有什么捷径的,我觉得一切都在于悟性,师傅领进门,修行在个人,譬如我就修行不够)少象我一样作大量的无用功。还有,主要就是一个程序员应该具备的基本功(个人看法),有人称其为“内功”,我觉得很对。没有扎实的基本功,我们如何能够做到游刃有余的编写高质量高性能的优秀程序呢?

让我们共同努力,振兴我们的民族软件业!

C语言高效编程的绝招(转)

编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。

  第一招:以空间换时间

  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:

  方法A:通常的办法

#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is a example!!");

方法B:
const char string2[LEN] ="This is a example!";
char * cp;
cp = string2 ;

使用的时候可以直接用指针来操作。

  从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

  如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下:

  方法C:

#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
 return ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);
}
void SET_BITS(int __dst,
int __bf, int __val)
{
 __dst = ((__dst) & ~(BIT_MASK(__bf))) |
\
 (((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
}

SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);


  方法D:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf)
(((1U << (bw ## __bf)) - 1)
<< (bs ## __bf))
#define SET_BITS(__dst, __bf, __val)
\
((__dst) = ((__dst) & ~(BIT_MASK(__bf)))
| \
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);


  函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。

  而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

  D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。
第二招:数学方法解决问题

  现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~100的和。

  方法E:
int I , j;
for (I = 1 ;I<=100; I ++)
{
 j += I;
}


  方法F
int I;
I = (100 * (1+100)) / 2


  这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

  第三招:使用位操作

  实现高效的C语言编写的第三招——使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:

  方法G
int I,J;
I = 257 /8;
J = 456 % 32;


  方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);


  在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

  运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。

  第四招:汇编嵌入

  高效C语言编程的必杀技,第四招——嵌入汇编。"在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。举例如下,将数组一赋值给数组二,要求每一字节都相符。
char string1[1024],string2[1024];


  方法I
int I;
for (I =0 ;I<1024;I++)
 *(string2 + I) = *(string1 + I)


  方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
 MOV R0,string1
 MOV R1,string2
 MOV R2,#0
loop:
 LDMIA R0!, [R3-R11]
 STMIA R1!, [R3-R11]
 ADD R2,R2,#8
 CMP R2, #400
 BNE loop
}
#endif

  方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

  虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。
2006/2/23

Turbo C2.0中的变量存储类型

    Turbo C2.0支持四种变量存储类型。说明符如下:
     auto      static    extern    register
下面分别来介绍。
    一、auto
    auto称为自动变量, 用关键字auto进行说明, 当auto省略时, 所有的非全程变量都被认为是局部变量, 所以auto实际上从来不用。
    局部变量在函数调用时自动产生, 但不会自动初始化, 随函数调用的结束, 这个变量也就自动消失了, 下次调用此函数时再自动产生, 还要再赋值, 退出时又自动消失。 
    二、static
    static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
    1. 静态局部变量
    它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。
    2. 静态全程变量
    Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。
    三、extern
    extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。因此,   必须将全程变量通知每一个程序模块文件,   此时可用extern来说明。
    例如:
        文件1为file1.c                     文件2为file2.c
    int i, j;/*定义全程变量*/           extern int i, j;/*说明将i, j从文件1中复制过来*/
    char c;                               extern char c; /*将c复制过来*/
    void func1(int k);                  func2()        /*用户定义函数*/
                                          {
    main()                                  static float k;/*定义静态变量*/
    {                                        i=j*5/100;
          func1(20);/*调用函数*/         k=i/1.5;
          func2();                              .
          .                                      .
          .                                      .
          .                                 }
     }
     func1(int k) /*用户定义函数*/
     {
          j=k*100;
     }

    对于以上两个文件file1.c和file2.c, 用Turbo C2.0的集成开发环境进行编译连接时, 首先应建立一个.prj的文件。例如file.prj, 该文件内容如下:
     file1.c
     file2.c
    然后将file.prj的文件名写入主菜单Project中的Project Name项中。 再用F9编译连接, 就可产生一个文件名为fioe.exe的可执行文件。
    外部变量和FORTRAN语言中的COMMOM定义的公共变量一样。
    四、register
    register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中,  而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过限制数目的寄存器变量当作非寄存器变量来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。
    另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,因此, 不能用作全程变量。定义一个整型寄存器变量可写成:
      register int a;
    对于以上所介绍的变量类型和变量存储类型将会在以后的学习中, 通过例行程序中的定义、使用来逐渐加深理解。

C语言学习之一

(摘)
2.3 字符型(char)
    加上不同的修饰符, 可以定义有符号和无符号两种类型的字符型变量, 例如:
    char a:              /*a被定义为有符号字符变量*/
    unsigned char l;     /*l被定义为无符号字符变量*/
    字符在计算机中以其ASCII码方式表示, 其长度为1个字节, 有符号字符型数取值范围为-128~127, 无符号字符型数到值范围是0~255。因此在Turbo C语言中,字符型数据在操作时将按整型数处理, 如果某个变量定义成char, 则表明该变量是有符号的, 即它将转换成有符号的整型数。
    Turbo C中规定对ASCII码值大于0x80的字符将被认为是负数。例如ASCII 值为0x8c的字符, 定义成char时,   被转换成十六进制的整数0xff8c 。 这是因当ASCII码值大于0x80时, 该字节的最高位为1, 计算机会认为该数为负数,   对于0x8c表示的数实际上是-74H(8c的各位取反再加1), 而-74H 转换成两字节整型数并在计算机中表示时就是0xff8c(  对0074 各位取反再加1)  。  因此只有定义为unsigned char 0x8c转换成整型数时才是8c。这一点在处理大于0x80的ASCII码字符时(例如汉字码)要特别注意。一般汉字均定义为unsigned char(在以后的程序中会经常碰到)。
    另外, 也可以定义一个字符型数组(关于数组后面再作详细介绍), 此时该数组表示一个字符串。
    例如:
        char str[10];
    计算机在编译时, 将留出连续10个字符的空间, 即str[0]到str[9]共10个变量, 但只有前9个供用户使用。第10个str[9]用来存放字符串终止符NULL即"\0",但终止符是编编译程序自动加上的, 这一点应特别注意。

    二、字符常数表示
    能用符号表示的字符可直接用单引号括起来表示, 如'a', '9', 'Z',  也可用该字符的ASCII码值表示, 例如十进制数85表示大写字母'U', 十六进制数0x5d表示']', 八进制数0102表示大写字母'B'。
    一些不能用符号表示的控制符, 只能用ASCII码值来表示, 如十进制数10 表示换行, 下六进制数0x0d表示回车, 八进制数033表示Esc。Turbo C2.0中也有另外一种表示表示方法, 如'\033'表示Esc,  这里'\ 0' 符号后面的数字表示十六进制的ASCII值当然这种表示方法也适用于可睦接用符号表示的字符。
    另外, Turbo C2.0中有些常用的字符用以下特殊规定来表示:
          规定符            等价于           含义
          '\f'               '\X0C'          换页
          '\r'               '\X0D'          回车
          '\t'               '\X09'          制表键
          '\n'               '\X0A'          换行
          '\\'               '\X5C'          \符
          '\''               '\X27'          '符
          '\"'               '\X22'          "符
    对于字符串常量, 一般用双引号括起来表示, 如"Hello Turbo C2.0"。

    2.4  指针型(*)
    指针是一种特殊的数据类型, 在其它语言中一般没有。指针是指向变量的地址, 实质上指针就是存贮单元的地址。  根据所指的变量类型不同,   可以是整型指针(int *)、浮点型指针(float *)、字符型指针(char *)、结构指针(struct *)和联合指针(union *)(结构指针和联合指针将在第4节中介绍)。
 
    2.5 无值型(void)
    无值型字节长度为0, 主要有两个用途:  一是明确地表示一个函数不返回任何值; 一是产生一个同一类型指针(可根据需要动态分配给其内存)。
    例如:
             void *buffer;    /*buffer被定义为无值型指针*/