??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. SMTPQ?/span>Simple Mail Transfer ProtocolQ?/span> SMTP 是一UTCP协议支持的提供可靠且有效电子邮g传输的应用层协议。SMTP 是徏立在 TCP上的一U邮件服务,主要用于传输pȝ之间的邮件信息ƈ提供来信有关的通知。SMTP主要负责底层的邮件系l如何将邮g从一台机器传臛_外一台机器?/p> 2. POPQ?/span>Post Office ProtocolQ?/span> 目前的版本ؓPOP3QPOP3是把邮g从电子邮׃传输到本地计机的协议?nbsp; 3. IMAPQ?/span>Internet Message Access ProtocolQ?/span> 目前的版本ؓIMAP4Q是POP3的一U替代协议,提供了邮件检索和邮g处理的新功能Q这L户可以完全不必下载邮件正文就可以看到邮g的标题摘要,从邮件客L软g可以对服务器上的邮件和文g夹目录等q行操作。IMAP协议增强了电子邮件的灉|性,同时也减了垃圾邮gҎ地系l的直接危害Q同时相对节省了用户察看电子邮g的时间。除此之外,IMAP协议可以记忆用户在脱机状态下寚w件的操作Q例如移动邮Ӟ删除邮g{)在下一ơ打开|络q接的时候会自动执行?nbsp; 下面?span style="font-family: 'Times New Roman';">sina?/span>sohuq两个电子邮局Z来讲解电子邮件的传输q程和工作原理。假?/span>sina邮箱的̎户ؓlisi@sina.comQ?/span>sohu邮箱的̎户ؓwangwu@sohu.comQ它们之间的邮g收发q程如下图所C: 图中实线部分表示lisi@sina.com账户?/span>wangwu@sohu.com账户发送邮件的q程Q虚UK分表C?/span>wangwu@sohu.com账户?/span>lisi@sina.com账户发送邮件的q程。下面通过分析lisi@sina.com账户?/span>wangwu@sohu.com账户发送邮件的q程Q来具体讲解一邮件从发送到接收所涉及的环节。 lisi@sina.com的邮件客LE序Q这里假设ؓOutlook ExpressQ与sina?/span>SMTP服务器徏立网l连接,q以lisi的用户名和密码进行登录后Q?/span>SMTP协议把邮件发送给sina?/span>SMTP服务器?/span> sina?/span>SMTP服务器收?/span>lisi@sina.com提交的电子邮件后Q首先根据收件h的地址后缀判断接收者的邮g地址是否属于?/span>SMTP服务器的辖范围Q如果是的话q接把邮g存储到收件h的邮׃Q否则,sina?/span>SMTP服务器向DNS服务器查询收件h的邮件地址后缀Q?/span>sohu.comQ所表示的域名的MX记录Q从而得?/span>sohu?/span>SMTP服务器信息,然后?/span>sohu?/span>SMTP服务器徏立连接ƈ采用SMTP协议把邮件发送给sohu?/span>SMTP服务器?/span> sohu?/span>SMTP服务器收?/span>sina?/span>SMTP服务器发来的电子邮g后,也将Ҏ收g人的地址判断该邮件是否属于该SMTP服务器的辖范围Q如果是的话q接把邮g存储到收件h的邮׃Q否则(一般不会出现这U情况)Q?/span>sohu?/span>SMTP服务器可能l{发这电子邮Ӟ也可能丢弃这电子邮件?/span> 拥有wangwu@sohu.com账户的用户通过邮g客户端程序(q里假设也ؓOutlook ExpressQ与sohu?/span>POP3/IMAP服务器徏立网l连接,q以wangwu的用户名和密码进行登录后Q就可以通过POP3?/span>IMAP协议查看wangwu@sohu.com邮箱中是否有新邮Ӟ如果有的话,则?/span>POP3?/span>IMAP协议d邮箱中的邮g?/span> 图中的虚UK分表C?span style="font-family: 'Times New Roman';">wangwu@sohu.com账户?/span>lisi@sina. com账户发送邮件的q程Q此q程?/span>lisi@sina.com账户?/span>wangwu@ sohu.com账户发送邮件的q程cMQ这里不再复q?/span> 邮g客户端Y件与SMTP服务器之_以及两台SMTP服务器之间都采用SMTP协议q行通信。邮件客L软g只采?/span>SMTP协议发送邮Ӟ即邮件客L软g只作?/span>SMTP协议的发送方?/span>SMTP服务器既要采?/span>SMTP协议向其?/span>SMTP服务器发送邮Ӟ又要采用SMTP协议接收其他SMTP服务器或邮g客户端Y件发送来的邮Ӟ?/span>SMTP服务器既作ؓSMTP协议的发送方Q又作ؓSMTP协议的接收方。邮件客L软g?/span>SMTP服务器都可以使用SMTP协议发送邮Ӟ仅发送邮件这一功能而言Q它们在技术实C有何差异呢?它们的差异主要体现在以下两个斚wQ?/span> Q?span style="font-family: 'Times New Roman';">1Q?/span>SMTP服务器接收到邮g客户端Y件发送来的邮件后Q需要根据收件h地址的域名将邮g转发l目标域?/span>SMTP服务器,而大量的收g人地址中肯定会出现各种可能的域名,因此Q?/span>SMTP服务器涉及到要与其他多台不能事先定?/span>SMTP服务器进行通信Q它需要具有根据收件h地址的域名查询出该域?/span>SMTP服务器的功能Q即需要具有查询域名的MX记录的功能。邮件客L软g被设|ؓ与固定的SMTP服务器通信Q它可以直接与指定的SMTP服务器徏立网l连接,因此它不需要具有根据收件h地址的域名来查询该域?/span>SMTP服务器的功能?/span> Q?span style="font-family: 'Times New Roman';">2Q对于来自某个邮件客L软g的邮件传输请求,SMTP服务器可能需要对发g人的用户账号信息q行验证Q因此,邮g客户端Y仉要具有向SMTP服务器传送用戯̎号信息的功能?/span>SMTP服务器能够直接接受来自其?/span>SMTP服务器的邮g传输hQ因此,SMTP服务器在发送邮件时Ҏ不需要传送用戯̎号信息的功能?nbsp; ?span style="font-family: 'Times New Roman';">DNS服务器上除了可以建立L名与IP地址的映外Q还可以建立其他多种映射Q例如,建立某个L名与其别名的映射Q徏立某个域名与?/span>SMTP服务器的映射。在DNS服务器上创徏的各Ҏ关pȝ录,一Ҏ关pd是一条记录,?/span>DNS服务器上创徏的主机名?/span>IP地址的映关pȝ?/span>A记录Q主机名与别名的映射关系UCؓCNAME记录Q域名与?/span>SMTP服务器的映射关系UCؓMX记录?/span> ?span style="font-family: 'Times New Roman';">DNS服务器上Z么要建立MX记录呢?即ؓ什么要建立域名与其SMTP服务器的映射关系呢?q与电子邮g地址的表CŞ式和工作原理有关。邮件地址后缀部分表示的通常都是一个域名,而不是接攉件的服务器的L名,例如Q邮件地址“zxx@it315.org”中的“it315.org”对应的就是一个域名。域只是一个逻辑l合概念Q它q不代表真正的计机Q对于用某个域名作为后~的邮件地址Q外界发送给它的电子邮g必须׃C门的SMTP服务器来q行接收和处理,接收和处理某个域的电子邮件的SMTP服务器即域的SMTP服务器,外界发送给某个域的电子邮g实际上都是发送给该域?/span>SMTP服务器。外界如何知道一个域?/span>SMTP服务器的地址呢?q就是通过理该域?/span>DNS服务器上?/span>MX记录来获得的Q这也就是在DNS服务器上Z么要建立域名与其SMTP服务器的映射关系的原因?/span> 当某?span style="font-family: 'Times New Roman';">SMTP服务器要l?#8220;zxx@it315.org”发送一电子邮件时Q该SMTP服务器将Ҏ邮g地址的后~部分而去查询“it315.org”q个域的MX记录Q得到这个域?/span>SMTP服务器的L名ؓ“mail.it315.org”Q然后将邮g发送给“mail.it315.org”q个SMTP服务器?/span> 一、什么是Unicode 先从ASCII说vQASCII是用来表C文字W的一U编码规范。每个ASCII字符占用1个字节,因此QASCII~码可以表示的最大字W数?55Q?0H—FFHQ。其实,英文字符q没有那么多Q一般只用前128个(00H—7FHQ最高位?Q,其中包括了控制字W、数字、大写字母和其它一些符受而最高位?的另128个字W(80H—FFHQ被UCؓ“扩展ASCII”Q一般用来存放英文的制表W、部分音标字W等{的一些其它符受?br /> q种字符~码规则昄用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字W显然不够用?br />于是Q各个国家纷U制定了自己的文字编码规范,其中中文的文字编码规范叫?#8220;GB2312—80”Q它是和ASCII兼容的一U编码规范,其实是利用扩展ASCII没有真正标准化这一点,把一个中文字W用两个扩展ASCII字符来表C,以区分ASCII码部分?br /> 但是q个Ҏ有问题,最大的问题是中文的文字编码和扩展ASCII码有重叠。而很多Y件利用扩展ASCII码的英文制表W来画表|q样的Y件用C文系l中Q这些表格就会被误认作中文字W,出现q?br /> 另外Q由于各国和各地区都有自q文字~码规则Q它们互相冲H,q给各国和各地区交换信息带来了很大的ȝ?br />要真正解册个问题,不能从扩展ASCII的角度入手,而必L一个全新的~码pȝQ这个系l要可以中文、法文、d?#8230;…{等所有的文字l一h考虑Qؓ每一个文字都分配一个单独的~码?/p>
于是QUnicode诞生了?/p>
Unicode也是一U字W编码方法,它占用两个字节(0000H—FFFFHQ?容纳65536个字W,q完全可以容U_世界所有语a文字的编码?br />在Unicode里,所有的字符被一视同仁,汉字不再使用“两个扩展ASCII”Q而是使用“1个Unicode”Q也是_所有的文字都按一个字W来处理Q它们都有一个唯一的Unicode码?/p>
二、用Unicode~码的好?/p>
使用Unicode~码可以使您的工E同时支持多U语aQ您的工程国际化?br /> 另外QWindows NT是用Unicodeq行开发的Q整个系l都是基于Unicode的。如果调用一个API函数q给它传递一个ANSIQASCII字符集以及由此派生ƈ兼容的字W集Q如QGB2312Q通常UCؓANSI字符集)字符Ԍ那么pȝ首先要将字符串{换成UnicodeQ然后将Unicode字符串传递给操作pȝ。如果希望函数返回ANSI字符Ԍpȝ׃首先Unicode字符串{换成ANSI字符Ԍ然后结果返回给您的应用E序。进行这些字W串的{换需要占用系l的旉和内存。如果用Unicode来开发应用程序,p够您的应用E序更加有效地运行?br /> 三、用C++q行Unicode~程 对宽字符的支持其实是ANSI C标准的一部分Q用以支持多字节表示一个字W。宽字符和Unicodeq不完全{同QUnicode只是宽字W的一U编码方式?/p>
1、宽字符的定?/p>
在ANSI中,一个字W(charQ的长度Z个字节(ByteQ。用UnicodeӞ一个字W占据一个字QC++在wchar.h头文件中定义了最基本的宽字符cdwchar_tQ?/p> 从这里我们可以清楚地看到Q所谓的宽字W就是无W号短整数?/p>
2、常量宽字符?/p>
对C++E序员而言Q构造字W串帔R是一经常性的工作。那么,如何构造宽字符字符串常量呢Q很单,只要在字W串帔R前加上一个大写的L可以了Q比如: q个L非常重要Q只有带上它Q编译器才知道你要将字符串存成一个字W一个字。还要注意,在L和字W串之间不能有空根{?/p>
3、宽字符串库函数 Z操作宽字W串QC++专门定义了一套函敎ͼ比如求宽字符串长度的函数?/p> Z么要专门定义q些函数呢?最Ҏ的原因是QANSI下的字符串都是以’\0’来标识字W串QUnicode字符串以“\0\0”l束Q,许多字符串函数的正确操作均是以此为基q行。而我们知道,在宽字符的情况下Q一个字W在内存中要占据一个字的空_q就会操作ANSI字符的字W串函数无法正确操作。以”Hello”字符串ؓ例,在宽字符下,它的五个字符是: 于是QANSI字符串函敎ͼ如strlenQ在到W一?8后的00Ӟ׃认ؓ字符串到了Q用strlen对宽字符串求长度的结果就永远会是1Q?/p>
4、用宏实现对ANSI和Unicode通用的编E?/p>
可见QC++有一整套的数据类型和函数实现Unicode~程Q也是_您完全可以用C++实现Unicode~程?br />如果我们惌我们的程序有两个版本QANSI版本和Unicode版本。当Ӟ~写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符l护两套代码是非帔R烦的事情。ؓ了减ȝE的负担QC++定义了一pd的宏Q帮助您实现对ANSI和Unicode的通用~程?br /> C++宏实现ANSI和Unicode的通用~程的本质是Ҏ”_UNICODE”Q注意,有下划线Q定义与否,q些宏展开为ANSI或Unicode字符Q字W串Q?/p>
如下是tchar.h头文件中部分代码摘抄Q?/p> A、实现字W和帔R字符串定义的?我们只列Z个最常用的宏Q?/p>
注意Q?br /> “##”是ANSI C标准的预处理语法Q它叫做“_脓W号”Q表C将前面的Ld到宏参数上。也是_如果我们写_T(“Hello”)Q展开后即为L“Hello” B、实现字W串函数调用的宏 C++为字W串函数也定义了一pd宏,同样Q我们只例D几个常用的宏Q?/p>
四、用Win32 APIq行Unicode~程 Win32 API中定义了一些自q字符数据cd。这些数据类型的定义在winnt.h头文件中。例如: 五、VC++6.0中编写Unicode~码的应用程?/p>
VC++ 6.0支持Unicode~程Q但默认的是ANSIQ所以开发h员只需要稍微改变一下编写代码的习惯便可以轻杄写支持UNICODE的应用程序?br /> 使用VC++ 6.0q行Unicode~程主要做以下几工作: 1、ؓ工程dUNICODE和_UNICODE预处理选项?/p>
具体步骤Q打开[工程]->[讄…]对话框,如图1所C,在C/C++标签对话框的“预处理程序定?#8221;中去除_MBCSQ加上_UNICODE,UNICODE。(注意中间用逗号隔开Q改动后如图2Q?/p>
在没有定义UNICODE和_UNICODEӞ所有函数和cd都默认用ANSI的版本;在定义了UNICODE和_UNICODE之后Q所有的MFCcdWindows API都变成了宽字节版本了?br /> 因ؓMFC应用E序有针对Unicode专用的程序入口点Q我们要讄entry point。否则就会出现连接错误?br /> 讄entry point的方法是Q打开[工程]->[讄…]对话框,在Link늚Outputcd的Entry Point里填上wWinMainCRTStartup?/p>
3、用ANSI/Unicode通用数据cd 微Y提供了一些ANSI和Unicode兼容的通用数据cdQ我们最常用的数据类型有_T QTCHARQLPTSTR,LPCTSTR?br /> Z说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针Q这是ؓ了兼容Windows 3.1{?6位操作系l遗留下来的Q在Win32 中以及其它的32位操作系l中Qlong指针和near指针及far修饰W都是ؓ了兼容的作用Q没有实际意义。PQpointerQ表C是一个指针;CQconstQ表C是一个常量;T(_T?表示兼容ANSI和UnicodeQSTRQstringQ表C个变量是一个字W串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字W串。比如: 其实Q在上面的语句中Q即使您不加_T宏,MessageBox函数也会自动?#8220;你好”字符串进行强制{换。但我还是推荐您使用_T宏,以表C您有Unicode~码意识?/p>
4、修改字W串q算问题 一些字W串操作函数需要获取字W串的字W数(sizeof(szBuffer)/sizeof(TCHAR))Q而另一些函数可能需要获取字W串的字节数sizeof(szBuffer)。您应该注意该问题ƈ仔细分析字符串操作函敎ͼ以确定能够得到正的l果?br />ANSI操作函数以str开_如strcpy()Qstrcat()Qstrlen()Q?br />Unicode操作函数以wcs开_如wcscpyQwcscpy()Qwcslen()Q?br />ANSI/Unicode操作函数以_tcs开?_tcscpy(Cq行期库)Q?br />ANSI/Unicode操作函数以lstr开?lstrcpy(Windows函数)Q?br />考虑ANSI和Unicode的兼容,我们需要用以_tcs开头或lstr开头的通用字符串操作函数?/p>
六、D个Unicode~程的例?/p>
W一步: W二步: 弹出的对话框单击“?#8221;Q重新启动计机使设|生效?br />q行Unicode.exeE序q单?#8220;Button1”按钮Q看Q静态文本框出现了ؕ码?/p>
W三步: pq些吧,您好运?/p>一、三U协?/h2>
二、工作原?/span>
三、什么是MX记录
]]>
因ؓ大部分都搞错了一个重要的基础Q就是x64不代?4bitQ代?4bit的东西叫做IA64?/span>
说一大堆专业术语恐怕大部分人都懒得看,也看不懂Q就单说概念性的东西?/span>
真正意义上纯64bit的东西只有intel的IA64Q它完全不兼容x86q算Q需要用到x86-to-IA-64的解码器才能q行x86q算Q但是性能损失很厉実?/span>
x64q个东西准确来说应该是x86拓展x64技术,amd和intel的东西根本都是一个性质?/span>
q个技术是用来解决64bitpȝ处理x86代码需要损失性能的关键,因ؓ它是直接使用x86的cpu拓展?4bitQx86的cpu卛_以处理x86q算Q也可以处理64bitq算
和IA64的解码器可以说是完全反过来的东西QIA64的解码器是让64bit的cpu处理被{换成64bit?2bit代码Q而x64则是x86的cpu直接处理32bit?4bit的运?/span>
而争论的关键在?2bit?4bit的YӞ实际上现在我们用的所?4bit cpu都是x64的cpuQ?4bit的cpu只有Intel的安腄列而已Q也只有他们可以安装安腾服务器版原生U?4bit的windows?/span>
而x64的本质就是用来同时处?2bit?4bitQ所以在x64上面Ҏ无谓软g?2bit?4bit之分Q因Z者都可以非常利的运用在x64的构架上面,只是64bit的Y件效率比32bit的Y件要高得多,但是不代?2bit的Y件在x64上面会出现问题,当然q里不包括那些?6位安装代码的E序Qx64抛弃?6位,q你去问微Y?/span>
换句话说Q想要x64只运?4bit的时代是不会到来Q因为x64是Z同时q行x86?4bit而出现的东西Q那个时代只会属于安腾cpuQ而不是我们现在手里的拥有x64技术的x86 cpu?/span>
32bit的代码在x64中永q也不回消失Q因为那是x64出现的目的?br />http://flysky.fm1062.com/post/20091119-1.aspx
]]>
下面例D几个字符的编码以单演CANSI和Unicode的区别:
字符
A
N
?/td>
ANSI?/td>
41H
4eH
cdbaH
Unicode?/td>
0041H
004eH
548cH typedef unsigned short wchar_t;
wchar_t *str1=L" Hello";
size_t __cdel wchlen(const wchar_t*);
0x0048 0x0065 0x006c 0x006c 0x006f
在内存中Q实际的排列是:48 00 65 00 6c 00 6c 00 6f 00
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif
可见Q这些宏Ҏ”_UNICODE” 定义与否Q分别展开为ANSI或Unicode字符?tchar.h头文件中定义的宏可以分ؓ两类Q?
?/td>
未定义_UNICODE(ANSI字符)
定义了_UNICODE(Unicode字符)
TCHAR
char
wchar_t
_T(x)
x
L##x
?/td>
未定义_UNICODE(ANSI字符)
定义了_UNICODE(Unicode字符)
_tcschr
strchr
wcschr
_tcscmp
strcmp
wcscmp
_tcslen
strlen
wcslen typedef char CHAR;
typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
typedef CONST CHAR *LPCSTR, *PCSTR;
Win32 API在winnt.h头文件中定义了一些实现字W和帔R字符串的宏进行ANSI/Unicode通用~程。同P只例丑և个最常用的:#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR;
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
#define __TEXT(quote) L##quote // r_winnt
#else /* UNICODE */ // r_winnt
typedef char TCHAR, *PTCHAR;
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR LPCTSTR;
#define __TEXT(quote) quote // r_winnt
#endif /* UNICODE */ // r_winnt
从以上头文g可以看出Qwinnt.hҎ是否定义了UNICODEQ没有下划线Q,q行条g~译?br /> Win32 API也定义了一套字W串函数Q它们根据是否定义了“UNICODE”分别展开为ANSI和Unicode字符串函数。如Qlstrlen。API的字W串操作函数和C++的操作函数可以实现相同的功能Q所以,如果需要的话,您尽可能使用C++的字W串函数Q没必要去花太多_֊再去学习API的这些东ѝ?br /> 也许您从来没有注意到QWin32 API实际上有两个版本。一个版本接受MBCS字符Ԍ另一个接受Unicode字符丌Ӏ例如:其实Ҏ没有SetWindowText()q个API函数Q相反,有SetWindowTextA()和SetWindowTextW()。后~A表明q是MBCS函数Q后~W表示q是Unicode版本的函数。这些API函数的头文g在winuser.h中声明,下面例Dwinuser.h中的SetWindowText()函数的声明部分:#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
可见QAPI函数Ҏ定义UNICODE与否军_指向Unicode版本q是MBCS版本?br /> l心的读者可能已l注意到了UNICODE和_UNICODE的区别,前者没有下划线Q专门用于Windows头文Ӟ后者有一个前~下划U,专门用于Cq行时头文g。换句话_也就是在ANSI C++语言里面Ҏ_UNICODEQ有下划U)定义与否Q各宏分别展开为Unicode或ANSI字符Q在Windows里面ҎUNICODEQ无下划U)定义与否Q各宏分别展开为Unicode或ANSI字符?br /> 在后面我们将会看刎ͼ实际使用中我们不加严格区分,同时定义_UNICODE和UNICODEQ以实现UNICODE版本~程?
图一
图二
2、设|程序入口点
图三TCHAR* szText=_T(“Hello!”);
TCHAR szText[]=_T(“I Love You”);
LPCTSTR lpszText=_T(“大家好!”);
使用函数中的参数最好也要有变化Q比如:MessageBox(_T(“你好”));
打开VC++6.0Q新建基于对话框的工EUnicodeQ主对话框IDD_UNICODE_DIALOG中加入一个按钮控Ӟ双击该控件ƈd该控件的响应函数Q?/p>void CUnicodeDlg::OnButton1()
{
TCHAR* str1=_T("ANSI和UNICODE~码试验");
m_disp=str1;
UpdateData(FALSE);
}
d静态文本框IDC_DISPQ用ClassWizardl该控gdCStringcd变量m_disp?使用默认ANSI~码环境~译该工E,生成Unicode.exe?
打开“控制面板”Q单?#8220;日期、时间、语a和区域设|?#8221;选项Q在“日期、时间、语a和区域设|?#8221;H口中l单?#8220;区域和语a选项”选项Q弹?#8220;区域和语a选项”对话框?在该对话框中Q单?#8220;高”标签Q将“非Unicode的程序的语言”选项改ؓ“日语”Q单?#8220;应用”按钮Q如囑֛Q?/p>
囑֛
改ؓUnicode~码环境~译该工E,生成Unicode.exe。再ơ运行Unicode.exeE序q单?#8220;Button1”按钮。看到Unicode~码的优势了吧?/p>
]]>
在日常操作和l护计算机的q程中,常常可以听到有关BIOS讄和CMOS讄的一些说法,许多人对BIOS和CMOSl常混ؓ一谈。本文主要阐q对BIOS讄和CMOS讄在基本概念上的区分与联系?
BIOS是什?
所谓BIOSQ实际上是微机的基本输入输出系l(Basic InputQOutput SystemQ,其内定w成在微机L上的一个ROM芯片上,主要保存着有关微机pȝ最重要的基本输入输出程序,pȝ信息讄、开Z电自E序和系l启动自丄序等?
BIOS的功?
BIOS ROM芯片不但可以在主板上看到Q而且BIOS理功能如何在很大程度上军_了主板性能是否优越。BIOS理功能主要包括Q?
1Q?BIOS中断服务E序
BIOS中断服务E序实质上是微机pȝ中Y件与g之间的一个可~程接口Q主要用来在E序软g与微机硬件之间实现衔接。例如,DOS和Windows操作pȝ中对软盘、硬盘、光驱、键盘、显C器{外围设备的理Q都是直接徏立在BIOSpȝ中断服务E序的基上,而且操作人员也可以通过讉KINT 5、INT 13{中断点而直接调用BIOS中断服务E序?
2QBIOSpȝ讄E序
微机部g配置记录是放在一块可d?CMOS RAM 芯片中的Q主要保存着pȝ基本情况、CPUҎ、Y盘驱动器、显C器、键盘等部g的信息。在 BIOS ROM芯片中装?pȝ讄E序"Q主要用来设|CMOS RAM中的各项参数。这个程序在开机时按下某个特定键即可进入设|状态,q提供了良好的界面供操作人员使用。事实上Q这个设|CMOS参数的过E,习惯上也UCؓ" BIOS讄"。一旦CMOS RAM芯片中关于微机的配置信息不正时Q轻者会使得pȝ整体q行性能降低、Y盘驱动器等部g不能识别Q严重时׃由此引发一pȝ的Yg故障?
3Q?POST上电自检
微机按通电源后Q系l首先由POSTQPower On Self Test,上电自检)E序来对内部各个讑֤q行查。通常完整的POST自检包括对 CPU?40K基本内存?1M以上的扩展内存、ROM、主ѝCMOS存贮器、串q口、显C卡、Y盘子系l及键盘q行试Q一旦在自检中发现问题,pȝ给出提CZ息或鸣笛警告?
4Q?BIOSpȝ启动自DE序
pȝ在完?POST自检后, ROM BIOS 首先按照系l?CMOS讄中保存的启动序搜寻软硬盘驱动器及CD-ROM、网l服务器{有效地启动驱动器,d操作pȝ引导记录Q然后将pȝ控制权交l引D录,q由引导记录来完成系l的利启动?
CMOS是什?
CMOS(本意是指互补金属氧化物半g存储嚣,是一U大规模应用于集成电路芯片制造的原料)是微Z板上的一块可d的RAM芯片Q主要用来保存当前系l的g配置和操作h员对某些参数的设定。CMOS RAM芯片ql通过一块后备电池供电,因此无论是在x状态中Q还是遇到系l掉甉|况,CMOS信息都不会丢失?
׃CMOS RAM芯片本n只是一块存储器Q只h保存数据的功能,所以对CMOS中各参数的讑֮要通过专门的程序。早期的CMOS讄E序ȝ在Y盘上?如IBM的PC/AT机型)Q用很不方ѝ现在多数厂家将CMOS讄E序做到?BIOS芯片中,在开机时通过按下某个特定键就可进入CMOS讄E序而非常方便地对系l进行设|,因此q种CMOS讄又通常被叫做BIOS讄?
BIOS讄和CMOS讄的区别与联系
BIOS是主板上的一块EPROM或EEPROM芯片Q里面装有系l的重要信息和设|系l参数的讄E序QBIOS SetupE序)QCMOS是主板上的一块可d的RAM 芯片Q里面装的是关于pȝ配置的具体参敎ͼ其内容可通过讄E序q行d。CMOS RAM 芯片靠后备电池供电,即ɾpȝ掉电后信息也不会丢失。BIOS与CMOS既相兛_不同QBIOS中的pȝ讄E序是完成CMOS参数讄的手D;CMOS RAM既是BIOS讑֮pȝ参数的存攑֜所Q又?BIOS讑֮pȝ参数的结果。因此,完整的说法应该是"通过BIOS讄E序对CMOS参数q行讄"。由?BIOS和CMOS都跟pȝ讄密初相关Q所以在实际使用q程中造成了BIOS讄和CMOS讄的说法,其实指的都是同一回事Q但BIOS与CMOS却是两个完全不同的概念,千万不可搞淆?
何时要对BIOS或CMOSq行讄Q?
众所周知Q进行BIOS或CMOS讄是由操作人员Ҏ微机实际情况而h工完成的一十分重要的pȝ初始化工作。在以下情况下,必须q行BIOS或CMOSq行讄Q?
1、新购微?/font>
即带PnP功能的系l也只能识别一部分微机外围讑֤Q而对软硬盘参数、当前日期、时钟等基本资料{必ȝ操作人员q行讄Q因此新购买的微机必通过q行CMOS参数讄来告诉系l整个微机的基本配置情况?
2Q新增设?
׃pȝ不一定能认识新增的设备,所以必通过CMOS讄来告诉它。另外,一旦新增设备与原有讑֤之间发生了IRQ、DMA冲突Q也往往需要通过BIOS讄来进行排除?
3QCMOS数据意外丢失
在系l后备电池失效、病毒破坏了 CMOS数据E序、意外清除了CMOS参数{情况下Q常怼造成CMOS数据意外丢失。此时只能重新进入BIOS讄E序完成新的CMOS参数讄?
4Q系l优?
对于内存d{待旉、硬盘数据传输模式、内Q外 Cache的用、节能保护、电源管理、开机启动顺序等参数Q?BIOS中预定的讄对系l而言q不一定就是最优的Q此时往往需要经q多ơ试验才能找到系l优化的最佳组?/font>
最q很多国内外客户Q向我问到Y压羃与硬压羃的区别与选择的问题,今天我在q里对软压~卡与硬压羃卡做一个对比分析与介绍?/font>
Q一QY压羃DVR卡与压~卡
软压~卡Q也U视频采集卡Q该电\板卡主要是由1个或多个视频采集芯片及周边元件、电路组成,电\l构比硬压羃单,成本也远低于压~。这U卡只负责采集视频,而视频压~、解压羃及其他视频处理则是由CPUq算实现?/font>
压~卡Q也U视频采集压~卡Q该电\板卡与Y压羃卡不同的是,多了视频压羃与解压羃部分电\l构Q视频压~没有交l电脑CPUd理,而是交个DSP芯片d理的。所以硬压羃卡电路更复杂?/font>
Q二QY压羃DVR卡与压~卡主要开发商
软压~DVR卡硬件比较简单,软压~卡很少有芯片商提供开发包的,一般都需要自己公司完全自d发,所以开发难度较大,拥有完全自主开发能力的软压~卡研发商不多,主要有台湑֥偶、韩国Kodicom、与我国的深xL_智能等?/font>
压~卡厂商门大多是采用芯片厂商提供的驱动与SDK开发包Q进行二ơ开发,然后再整理出自己的开发包Q又提供l下一UY件开发商做三ơ开发。由于有芯片刉商提供了完善的开发包Q所以开发难度相对较,国内出现了一大批压~厂商,如:杭州康威视、成都d加拉、武汉恒ѝ广州金鹏、深圛_敏、杭州星辉等?/font>
Q三QY压羃DVR卡与压~卡优势Ҏ
1Q用寿?/font>
DVR产品更新换代快,变化最快的是压~算法与软g功能部分QY压羃卡(q里指的是正版Y压羃卡)灉|性强Q它没有把Y件与压羃法部分没有固化在芯片里Q升U灵z,不容易被淘汰掉,一旦有更高效率的压~算法,很快可以通过免费软g升而提高您的DVR质量Q而硬压羃DVR是将压羃法写入DSP芯片Q升U麻烦,使用寿命短,众所周知Q前几年的h值高辑և千甚至一万元以上的MPEG-1压~卡Q用不Cq就因ؓ无法升而淘C
2Q压~效?
在视频压~能力方面,压~优于Y压羃。Y压羃卡由于利用CPU压羃Q消耗电脑资源,合理配置电脑是Y压羃DVR长期E_q行的关键。随市场LCPU性能与速度加快QY压羃处理能力也随着加强Q采用普通的赛扬1.7Gp压羃4-8路(352 X 288Q实Ӟ一旦不久的来64位Windows操作pȝ面市QY压羃卡采用廉价AMD64位CPU压羃视频Q就成了轻轻松松的事情,压羃32路实时将不再是难题了。到了这时Y压羃可能取代硬压羃卡?/font>
在压~比斚wQ市面上常见的很多Y压羃DVR卡是国外早期产品Q它们采用的是小波算法甚至MJPEGQ消耗硬盘大Q网l性能差,但最q新推出软压~DVR卡大多是采用MPEG-4或?H.264法Q每路每时占硬?0-150M?/font>
3Q硬件成?/font>
在板卡成本与h斚wQY压羃卡有明显优势QY压羃卡hg般只有硬压羃卡的1/4~1/3?/font>
4Q图象质?/font>
在图象质量方面,主要军_视频采集芯片、电路抗w、分辨率与压~算法,其中压羃法、压~比军_回放DVR录象的画质,市面上销售的一些盗版Kodicom与Pico{国外早期Y压羃卡,׃采用8比特的FUSION878A 作视频采集芯片,图象质量不如采用PHILIPS芯片的硬压羃卡,但Y压羃也有采用PHILIPS7130?134芯片Q如Ether 9404 DVR卡,q种卡的预览画质与硬压羃卡基本一P但录象画质超q通常的硬压羃卡?/font>
5Q网l性能
在网l方面,软压~大多做得比压~卡更好Q也许是因ؓ开发Y压羃DVR厂家研发实力更强大吧Q但|络性能实与Y压羃或硬压羃无关Q网l性能好坏与压~算法有养I先进的压~算法由于压~比大,数据量,对带宽要求低Q网l性能则更好?/font>
?
?中有两个按钮Q一个是“输入{选器”Q指Ҏ服务器接受的数据包进行筛选)Q另一个是“输出{选器”Q指Ҏ服务器发送的数据包进行筛选)Q这里应该点击[输入{选器] 按钮Q会弹出一?#8220;d{选器”H口Q再点击[d]按钮Q表C增加一个筛选条件?br />
?#8220;协议”双的下拉列表中选择“ICMP”Q在随后出现?#8220;ICMPcd”?#8220;ICMP~码”中均输入“255”Q代表所有的ICMPcd及其~码。ICMP有许多不同的cdQPing是一U类型)Q每U类型也有许多不同的状态,用不同的“~码”来表C。因为其cd和编码很复杂Q这里不再叙q?br />
点击[定]按钮q回“输入{选器”H口Q此时会发现“{选器”列表中多了一内容(如图2所C)。点击[定]按钮q回“本地q接”H口Q再点击[定]按钮Q此时筛选器q效了Q从其他计算ZPingq台L׃会成功了?br />
?
2Q?用防火墙讄ICMPqo
现在许多防火墙在默认情况下都启用了ICMPqo的功能。如果没有启用,只要选中“防MICMPd”?#8220;防止别h用ping命o探测”可以了Q如?所C?br />
?
通过以上讲解Q你现在知道ICMP的重要性了吧?赶紧l你的服务器讄ICMPqo吧?br />
ICMP协议Q英文全UͼInternet Control Message ProtocolQ,是|际控制信息协议。主要是用于补充IP传输数据报的q程中,发送主机无法确定数据报是否到达目标L。ICMP报文分ؓ出错报告报文和查询报文两U。若数据报不能到辄标主机,ICMP出错报告报文可以以回送信息的方式Q向源主机发M息,q不能纠正数据报中的M出错。除了出错报告,ICMPq可以诊断出某些|络问题Q这是ICMP的查询报文?/p>
IGMP协议Q英文全UͼInternet Group Management ProtocolQ,|络l管理协议。主要用于徏立和理多播l,对IP分组q播q行控制?/p>
internet控制消息协议ICMP是用于报告错误ƈ代表IPҎ息进行控制?
IPq用互联l管理协议IGMP来告诉\由器Q某一|络上指导组中的可用L?
ICMP
ICMP源抑制消息:当TCP/IPL发送数据到另一LӞ如果速度辑ֈ路由器或者链路的饱和状态,路由器发Z个ICMP源抑制消息?
ICMP数据包结?
cdQ一?位类型字D,表示ICMP数据包类型?
代码Q一?位代码域Q表C指定类型中的一个功能。如果一个类型中只有一U功能,代码域置??
验和Q数据包中ICMP部分上的一?6位检验和?
指定cd的数据随每个ICMPcd变化的一个附加数据?
IGMP
IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网l中?
IGMP包结?
版本QIGMP的版本,g般ؓ0x1h?
cdQIGMP消息的类型?x1hcdUCؓL成员hQ在多\q播路由器上用于指定多l中的Q何成员轮询一个网l?x2hcdUCؓL成员报告Q在L上用于发布指定组中的成员情况或对一个\由器的主机成员请求进行回{?
未用Q未用的域名被发送者置零且被接收者忽略?
验和QIGMP头的一?6位检验和?
l地址Q主机用该组地址在一个主机成员请求中存储IP多\q播地址。在L成员h中,l地址被全|零Q而且gU的多\q播地址被用来标CZ机组?br>
LSB和MSB谁位于内存的最低地址Q?卌代表该对象的地址?
q就引出了大?Big Endian)与小?Little Endian)的问题?br>如果LSB在MSB前面Q?既LSB是低地址Q?则该机器是小? 反之则是大端?br>DEC (Digital Equipment CorporationQ现在是Compaq公司的一部分)和Intel的机器(X86q_Q一般采用小端?br>IBMQ?Motorola(Power PC)Q?Sun的机器一般采用大端?br>当然Q这不代表所有情c有的CPU卌工作于小端, 又能工作于大端, 比如ARMQ?AlphaQ摩托罗拉的PowerPC?具体情Ş参考处理器手册?/strong>
具体q类CPU是大端还是小端,应该和具体设|有兟?br>Q如QPower PC支持little-endian字节序,但在默认配置时是big-endian字节序)
一般来_大部分用L操作pȝQ如windows, FreeBsd,LinuxQ是Little Endian的。少部分Q如MAC OS ,是Big Endian 的?br>所以说QLittle Endianq是Big Endian与操作系l和芯片cd都有关系?/p>
Linuxpȝ中,你可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(?br>_BYTE_ORDER, __BYTE_ORDER)Q确定其倹{BYTE_ORDER中文UCؓ字节序。这个g般在endian.h或machine/endian.h文g中可以找?有时在feature.h中,不同的操作系l可能有所不同?/p>
对于一个数0x1122
使用Little Endian方式Ӟ低字节存?x22Q高字节存储0x11
而用Big Endian方式? 低字节存?x11, 高字节存?x22
l一|友指正,才知?上面的描q?是不准确?
想了?觉得如下描述可能更合?
使用Little Endian方式存储数据?数据的LSB相对最没意义的数据?存放在低地址位置,q里的LSB也就?2?也即,
低地址存储0x22, 高地址存储0x11
而用Big Endian方式存储数据?数据的MSB最有意义的数据?存放在低地址位置,q里的MSB也就?1?也即
低地址存储0x11, 高地址存储0x22
助记:
1)所谓MSB (Most Significant Byte),名字很复?不知是否有h没搞?反正我开始看到这个词时?很p涂,有点不完全理?其实单说MSB是,一个数字中,最重要的那?
举例来说,12004,中文M,一万两千零?那最高位?,pCZ一?此处q作MSB,最有意义的?
2)一般常见的数据存储,用文字写出来的时?其内容书写格?多数是从低地址到高地址.
举例,一?6q制数是 0x11 22 33, 而存攄位置?/p>
地址0x3000 中存?1
地址0x3001 中存?2
地址0x3002 中存?3
qv来就写成地址0x3000-0x3002中存放了数据0x112233.
而这U存攑֒表示方式,正好W合大端.
解释的有点ؕ,希望有h能看?
如果q有哪里有误,q请各位l箋指正.谢谢.
【用函数判断pȝ是Big Endianq是Little Endian?br>bool IsBig_Endian()
//如果字节序ؓbig-endianQ返回true;
//反之?nbsp; little-endianQ返回false
{
unsigned short test = 0x1122;
if(*( (unsigned char*) &test ) == 0x11)
return TRUE;
else
return FALSE;
}//IsBig_Endian()