﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-yehao's Blog-文章分类-计算机基础</title><link>http://www.cppblog.com/yehao/category/16799.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 27 Feb 2015 14:26:41 GMT</lastBuildDate><pubDate>Fri, 27 Feb 2015 14:26:41 GMT</pubDate><ttl>60</ttl><item><title>电子邮件工作原理</title><link>http://www.cppblog.com/yehao/articles/209882.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Fri, 27 Feb 2015 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/209882.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/209882.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/209882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/209882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/209882.html</trackback:ping><description><![CDATA[<div>转自http://blog.csdn.net/zyh5540/article/details/18953853<br /><br /><h2>一、三种协议</h2><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">1.&nbsp;<strong>SMTP<span style="font-family: 宋体;">（</span><span style="font-family: 'Times New Roman';">Simple&nbsp;Mail&nbsp;Transfer&nbsp;Protocol</span><span style="font-family: 宋体;">）</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;SMTP&nbsp;是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。SMTP&nbsp;是建立在&nbsp;TCP上的一种邮件服务，主要用于传输系统之间的邮件信息并提供来信有关的通知。SMTP主要负责底层的邮件系统如何将邮件从一台机器传至另外一台机器。</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">2.&nbsp;<strong>POP<span style="font-family: 宋体;">（</span><span style="font-family: 'Times New Roman';">Post&nbsp;Office&nbsp;Protocol</span><span style="font-family: 宋体;">）</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;目前的版本为POP3，POP3是把邮件从电子邮箱中传输到本地计算机的协议。&nbsp;&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">3.&nbsp;<strong>IMAP<span style="font-family: 宋体;">（</span><span style="font-family: 'Times New Roman';">Internet&nbsp;Message&nbsp;Access&nbsp;Protocol</span><span style="font-family: 宋体;">）</span></strong></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;目前的版本为IMAP4，是POP3的一种替代协议，提供了邮件检索和邮件处理的新功能，这样用户可以完全不必下载邮件正文就可以看到邮件的标题摘要，从邮件客户端软件就可以对服务器上的邮件和文件夹目录等进行操作。IMAP协议增强了电子邮件的灵活性，同时也减少了垃圾邮件对本地系统的直接危害，同时相对节省了用户察看电子邮件的时间。除此之外，IMAP协议可以记忆用户在脱机状态下对邮件的操作（例如移动邮件，删除邮件等）在下一次打开网络连接的时候会自动执行。&nbsp;&nbsp;</p><h2><a name="t1" style="color: rgb(202, 0, 0);"></a>&nbsp;<span style="font-family: 黑体;">二、工作原理</span></h2><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;下面以<span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">和</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">这两个电子邮局为例来讲解电子邮件的传输过程和工作原理。假设</span><span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">邮箱的账户为</span><span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">，</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">邮箱的账户为</span><span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">，它们之间的邮件收发过程如下图所示：</span></p><p align="center" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　&nbsp;<img src="http://img.blog.csdn.net/20140206222316609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenloNTU0MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="middle" style="border: none; max-width: 100%;" /></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">图中实线部分表示<span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">账户向</span><span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">账户发送邮件的过程，虚线部分表示</span><span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">账户向</span><span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">账户发送邮件的过程。下面通过分析</span><span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">账户向</span><span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">账户发送邮件的过程，来具体讲解一封邮件从发送到接收所涉及的环节。　</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">lisi@sina.com<span style="font-family: 宋体;">的邮件客户端程序（这里假设为</span><span style="font-family: 'Times New Roman';">Outlook&nbsp;Express</span><span style="font-family: 宋体;">）与</span><span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器建立网络连接，并以</span><span style="font-family: 'Times New Roman';">lisi</span><span style="font-family: 宋体;">的用户名和密码进行登录后，使用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议把邮件发送给</span><span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　<span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器收到</span><span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">提交的电子邮件后，首先根据收件人的地址后缀判断接收者的邮件地址是否属于该</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的管辖范围，如果是的话就直接把邮件存储到收件人的邮箱中，否则，</span><span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器向</span><span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器查询收件人的邮件地址后缀（</span><span style="font-family: 'Times New Roman';">sohu.com</span><span style="font-family: 宋体;">）所表示的域名的</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录，从而得到</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器信息，然后与</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器建立连接并采用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议把邮件发送给</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">sohu<span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器收到</span><span style="font-family: 'Times New Roman';">sina</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器发来的电子邮件后，也将根据收件人的地址判断该邮件是否属于该</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的管辖范围，如果是的话就直接把邮件存储到收件人的邮箱中，否则（一般不会出现这种情况），</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器可能继续转发这封电子邮件，也可能丢弃这封电子邮件。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　&nbsp;拥有<span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">账户的用户通过邮件客户端程序（这里假设也为</span><span style="font-family: 'Times New Roman';">Outlook&nbsp;Express</span><span style="font-family: 宋体;">）与</span><span style="font-family: 'Times New Roman';">sohu</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Times New Roman';">POP3/IMAP</span><span style="font-family: 宋体;">服务器建立网络连接，并以</span><span style="font-family: 'Times New Roman';">wangwu</span><span style="font-family: 宋体;">的用户名和密码进行登录后，就可以通过</span><span style="font-family: 'Times New Roman';">POP3</span><span style="font-family: 宋体;">或</span><span style="font-family: 'Times New Roman';">IMAP</span><span style="font-family: 宋体;">协议查看</span><span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">邮箱中是否有新邮件，如果有的话，则使用</span><span style="font-family: 'Times New Roman';">POP3</span><span style="font-family: 宋体;">或</span><span style="font-family: 'Times New Roman';">IMAP</span><span style="font-family: 宋体;">协议读取邮箱中的邮件。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　&nbsp;图中的虚线部分表示<span style="font-family: 'Times New Roman';">wangwu@sohu.com</span><span style="font-family: 宋体;">账户向</span><span style="font-family: 'Times New Roman';">lisi@sina.&nbsp;com</span><span style="font-family: 宋体;">账户发送邮件的过程，此过程与</span><span style="font-family: 'Times New Roman';">lisi@sina.com</span><span style="font-family: 宋体;">账户向</span><span style="font-family: 'Times New Roman';">wangwu@&nbsp;sohu.com</span><span style="font-family: 宋体;">账户发送邮件的过程类似，这里不再复述。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;邮件客户端软件与<span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器之间，以及两台</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器之间都采用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议进行通信。邮件客户端软件只采用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议发送邮件，即邮件客户端软件只作为</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议的发送方。</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器既要采用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议向其他</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器发送邮件，又要采用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议接收其他</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器或邮件客户端软件发送来的邮件，即</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器既作为</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议的发送方，又作为</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议的接收方。邮件客户端软件与</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器都可以使用</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">协议发送邮件，仅发送邮件这一功能而言，它们在技术实现上有何差异呢？它们的差异主要体现在以下两个方面：</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　（<span style="font-family: 'Times New Roman';">1</span><span style="font-family: 宋体;">）</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器接收到邮件客户端软件发送来的邮件后，需要根据收件人地址的域名将邮件转发给目标域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器，而大量的收件人地址中肯定会出现各种可能的域名，因此，</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器涉及到要与其他多台不能事先确定的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器进行通信，它需要具有根据收件人地址的域名查询出该域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的功能，即需要具有查询域名的</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录的功能。邮件客户端软件被设置为与固定的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器通信，它可以直接与指定的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器建立网络连接，因此它不需要具有根据收件人地址的域名来查询该域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的功能。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　（<span style="font-family: 'Times New Roman';">2</span><span style="font-family: 宋体;">）对于来自某个邮件客户端软件的邮件传输请求，</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器可能需要对发件人的用户账号信息进行验证，因此，邮件客户端软件需要具有向</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器传送用户账号信息的功能。</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器能够直接接受来自其他</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的邮件传输请求，因此，</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器在发送邮件时根本不需要传送用户账号信息的功能。&nbsp;</span></p><h2><a name="t2" style="color: rgb(202, 0, 0);"></a>三、什么是MX<span style="font-family: 黑体;">记录</span></h2><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　在<span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上除了可以建立主机名与</span><span style="font-family: 'Times New Roman';">IP</span><span style="font-family: 宋体;">地址的映射外，还可以建立其他多种映射，例如，建立某个主机名与其别名的映射；建立某个域名与其</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的映射。在</span><span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上创建的各项映射关系称为记录，一项映射关系就是一条记录，在</span><span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上创建的主机名与</span><span style="font-family: 'Times New Roman';">IP</span><span style="font-family: 宋体;">地址的映射关系称为</span><span style="font-family: 'Times New Roman';">A</span><span style="font-family: 宋体;">记录，主机名与别名的映射关系称为</span><span style="font-family: 'Times New Roman';">CNAME</span><span style="font-family: 宋体;">记录，域名与其</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的映射关系称为</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　在<span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上为什么要建立</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录呢？即为什么要建立域名与其</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的映射关系呢？这与电子邮件地址的表示形式和工作原理有关。邮件地址后缀部分表示的通常都是一个域名，而不是接收邮件的服务器的主机名，例如，邮件地址&#8220;</span><span style="font-family: 'Times New Roman';">zxx@it315.org</span><span style="font-family: 宋体;">&#8221;中的&#8220;</span><span style="font-family: 'Times New Roman';">it315.org</span><span style="font-family: 宋体;">&#8221;对应的就是一个域名。域只是一个逻辑组合概念，它并不代表真正的计算机，对于使用某个域名作为后缀的邮件地址，外界发送给它的电子邮件必须由一台专门的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器来进行接收和处理，接收和处理某个域的电子邮件的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器即为该域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器，外界发送给某个域的电子邮件实际上都是发送给该域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器。外界如何知道一个域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的地址呢？这就是通过管理该域的</span><span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上的</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录来获得的，这也就是在</span><span style="font-family: 'Times New Roman';">DNS</span><span style="font-family: 宋体;">服务器上为什么要建立域名与其</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的映射关系的原因。</span></p><p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">　　　当某台<span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器要给&#8220;</span><span style="font-family: 'Times New Roman';">zxx@it315.org</span><span style="font-family: 宋体;">&#8221;发送一封电子邮件时，该</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器将根据邮件地址的后缀部分而去查询&#8220;</span><span style="font-family: 'Times New Roman';">it315.org</span><span style="font-family: 宋体;">&#8221;这个域的</span><span style="font-family: 'Times New Roman';">MX</span><span style="font-family: 宋体;">记录，得到这个域的</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器的主机名为&#8220;</span><span style="font-family: 'Times New Roman';">mail.it315.org</span><span style="font-family: 宋体;">&#8221;，然后将邮件发送给&#8220;</span><span style="font-family: 'Times New Roman';">mail.it315.org</span><span style="font-family: 宋体;">&#8221;这个</span><span style="font-family: 'Times New Roman';">SMTP</span><span style="font-family: 宋体;">服务器。</span></p></div><img src ="http://www.cppblog.com/yehao/aggbug/209882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2015-02-27 16:12 <a href="http://www.cppblog.com/yehao/articles/209882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于OS系统的x86、x64与IA32、IA64的关系</title><link>http://www.cppblog.com/yehao/articles/186124.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Fri, 03 Aug 2012 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/186124.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/186124.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/186124.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/186124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/186124.html</trackback:ping><description><![CDATA[<span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">关于windows、Linux、Unix及其他主流OS系统的x86和x64版本，其实这个根本和32bit和64bit没有直接关联，只是间接关联而已。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">因为大部分都搞错了一个重要的基础，就是x64不代表64bit，代表64bit的东西叫做IA64。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">说一大堆专业术语恐怕大部分人都懒得看，也看不懂，就简单说概念性的东西。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">真正意义上纯64bit的东西只有intel的IA64，它完全不兼容x86运算，需要用到x86-to-IA-64的解码器才能进行x86运算，但是性能损失很厉害。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">x64这个东西准确来说应该是x86拓展x64技术，amd和intel的东西根本都是一个性质。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">这个技术是用来解决64bit系统处理x86代码需要损失性能的关键，因为它是直接使用x86的cpu拓展到64bit，使x86的cpu即可以处理x86运算，也可以处理64bit运算</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">和IA64的解码器可以说是完全反过来的东西，IA64的解码器是让64bit的cpu处理被转换成64bit的32bit代码，而x64则是x86的cpu直接处理32bit和64bit的运算。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">而争论的关键就在于32bit和64bit的软件，实际上现在我们使用的所谓64bit cpu都是x64的cpu，64bit的cpu只有Intel的安腾系列而已，也只有他们可以安装安腾服务器版原生纯64bit的windows。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">而x64的本质就是用来同时处理32bit和64bit，所以在x64上面根本无谓软件的32bit和64bit之分，因为两者都可以非常顺利的运用在x64的构架上面，只是64bit的软件效率比32bit的软件要高得多，但是不代表32bit的软件在x64上面会出现问题，当然这里不包括那些使用16位安装代码的程序，x64抛弃了16位，这你去问微软。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">换句话说，想要x64只运行64bit的时代是不会到来，因为x64就是为了同时运行x86和64bit而出现的东西，那个时代只会属于安腾cpu，而不是我们现在手里的拥有x64技术的x86 cpu。</span><br style="margin: 0px; padding: 0px; color: #444444; font-family: tahoma, Verdana, sans-serif; " /><span style="color: #444444; font-family: tahoma, Verdana, sans-serif; ">32bit的代码在x64中永远也不回消失，因为那就是x64出现的目的。<br /></span><a href="http://flysky.fm1062.com/post/20091119-1.aspx">http://flysky.fm1062.com/post/20091119-1.aspx</a><img src ="http://www.cppblog.com/yehao/aggbug/186124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2012-08-03 09:22 <a href="http://www.cppblog.com/yehao/articles/186124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++的Unicode编程</title><link>http://www.cppblog.com/yehao/articles/156997.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Tue, 27 Sep 2011 12:05:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/156997.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/156997.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/156997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/156997.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/156997.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 24px; font-family: Tahoma; letter-spacing: 1px"> 
<p>一、什么是Unicode</p>
<p>　　先从ASCII说起，ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节，因此，ASCII编码可以表示的最大字符数是255（00H&#8212;FFH）。其实，英文字符并没有那么多，一般只用前128个（00H&#8212;7FH，最高位为0），其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符（80H&#8212;FFH）被称为&#8220;扩展ASCII&#8221;，一般用来存放英文的制表符、部分音标字符等等的一些其它符号。<br />　　这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字，255个字符显然不够用。<br />于是，各个国家纷纷制定了自己的文字编码规范，其中中文的文字编码规范叫做&#8220;GB2312&#8212;80&#8221;，它是和ASCII兼容的一种编码规范，其实就是利用扩展ASCII没有真正标准化这一点，把一个中文字符用两个扩展ASCII字符来表示，以区分ASCII码部分。<br />　　但是这个方法有问题，最大的问题就是中文的文字编码和扩展ASCII码有重叠。而很多软件利用扩展ASCII码的英文制表符来画表格，这样的软件用到中文系统中，这些表格就会被误认作中文字符，出现乱码。<br />　　另外，由于各国和各地区都有自己的文字编码规则，它们互相冲突，这给各国和各地区交换信息带来了很大的麻烦。<br />要真正解决这个问题，不能从扩展ASCII的角度入手，而必须有一个全新的编码系统，这个系统要可以将中文、法文、德文&#8230;&#8230;等等所有的文字统一起来考虑，为每一个文字都分配一个单独的编码。</p>
<p>于是，Unicode诞生了。</p>
<p>　　Unicode也是一种字符编码方法，它占用两个字节（0000H&#8212;FFFFH）,容纳65536个字符，这完全可以容纳全世界所有语言文字的编码。<br />在Unicode里，所有的字符被一视同仁，汉字不再使用&#8220;两个扩展ASCII&#8221;，而是使用&#8220;1个Unicode&#8221;，也就是说，所有的文字都按一个字符来处理，它们都有一个唯一的Unicode码。</p>
<p>二、使用Unicode编码的好处</p>
<p>　　使用Unicode编码可以使您的工程同时支持多种语言，使您的工程国际化。<br />　　另外，Windows NT是使用Unicode进行开发的，整个系统都是基于Unicode的。如果调用一个API函数并给它传递一个ANSI（ASCII字符集以及由此派生并兼容的字符集，如：GB2312，通常称为ANSI字符集）字符串，那么系统首先要将字符串转换成Unicode，然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串，系统就会首先将Unicode字符串转换成ANSI字符串，然后将结果返回给您的应用程序。进行这些字符串的转换需要占用系统的时间和内存。如果用Unicode来开发应用程序，就能够使您的应用程序更加有效地运行。<br /><br />下面例举几个字符的编码以简单演示ANSI和Unicode的区别：</p>
<table id="table1" style="font-size: 14px; line-height: 18pt; font-family: Tahoma; letter-spacing: 1px" width="52%" border="1">
<tbody>
<tr>
<td align="center">字符</td>
<td align="center">&nbsp;A</td>
<td align="center">&nbsp;N</td>
<td align="center">&nbsp;和</td></tr>
<tr>
<td align="center">ANSI码</td>
<td align="center">&nbsp;41H</td>
<td align="center">&nbsp;4eH</td>
<td align="center">&nbsp;cdbaH</td></tr>
<tr>
<td align="center" height="20">Unicode码</td>
<td align="center" height="20">&nbsp;0041H</td>
<td align="center" height="20">&nbsp;004eH</td>
<td align="center" height="20">&nbsp;548cH</td></tr></tbody></table>
<p>三、使用C++进行Unicode编程</p>
<p>　　对宽字符的支持其实是ANSI C标准的一部分，用以支持多字节表示一个字符。宽字符和Unicode并不完全等同，Unicode只是宽字符的一种编码方式。</p>
<p>1、宽字符的定义</p>
<p>　　在ANSI中，一个字符（char）的长度为一个字节（Byte）。使用Unicode时，一个字符占据一个字，C++在wchar.h头文件中定义了最基本的宽字符类型wchar_t：</p><pre>typedef unsigned short wchar_t;</pre>
<p>从这里我们可以清楚地看到，所谓的宽字符就是无符号短整数。</p>
<p>2、常量宽字符串</p>
<p>　　对C++程序员而言，构造字符串常量是一项经常性的工作。那么，如何构造宽字符字符串常量呢？很简单，只要在字符串常量前加上一个大写的L就可以了，比如：</p><pre>wchar_t *str1=L" Hello";</pre>
<p>这个L非常重要，只有带上它，编译器才知道你要将字符串存成一个字符一个字。还要注意，在L和字符串之间不能有空格。</p>
<p>3、宽字符串库函数</p>
<p>为了操作宽字符串，C++专门定义了一套函数，比如求宽字符串长度的函数是</p><pre>size_t __cdel wchlen(const wchar_t*);</pre>
<p>　　为什么要专门定义这些函数呢？最根本的原因是，ANSI下的字符串都是以&#8217;\0&#8217;来标识字符串尾的（Unicode字符串以&#8220;\0\0&#8221;结束），许多字符串函数的正确操作均是以此为基础进行。而我们知道，在宽字符的情况下，一个字符在内存中要占据一个字的空间，这就会使操作ANSI字符的字符串函数无法正确操作。以&#8221;Hello&#8221;字符串为例，在宽字符下，它的五个字符是：<br />0x0048 0x0065 0x006c 0x006c 0x006f<br />在内存中，实际的排列是：</p><pre>48 00 65 00 6c 00 6c 00 6f 00</pre>
<p>　　于是，ANSI字符串函数，如strlen，在碰到第一个48后的00时，就会认为字符串到尾了，用strlen对宽字符串求长度的结果就永远会是1！</p>
<p>4、用宏实现对ANSI和Unicode通用的编程</p>
<p>　　可见，C++有一整套的数据类型和函数实现Unicode编程，也就是说，您完全可以使用C++实现Unicode编程。<br />如果我们想要我们的程序有两个版本：ANSI版本和Unicode版本。当然，编写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是，针对ANSI字符和Unicode字符维护两套代码是非常麻烦的事情。为了减轻编程的负担，C++定义了一系列的宏，帮助您实现对ANSI和Unicode的通用编程。<br />　　C++宏实现ANSI和Unicode的通用编程的本质是根据&#8221;_UNICODE&#8221;（注意，有下划线）定义与否，这些宏展开为ANSI或Unicode字符（字符串）。</p>
<p>如下是tchar.h头文件中部分代码摘抄：</p><pre>#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 
</pre>　　 可见，这些宏根据&#8221;_UNICODE&#8221; 定义与否，分别展开为ANSI或Unicode字符。 tchar.h头文件中定义的宏可以分为两类： 
<p>A、实现字符和常量字符串定义的宏 我们只列出两个最常用的宏：</p>
<table id="table2" style="font-size: 14px; line-height: 18pt; font-family: Tahoma; letter-spacing: 1px" width="52%" border="1">
<tbody>
<tr>
<td align="center" width="64">宏</td>
<td align="center">未定义_UNICODE(ANSI字符)</td>
<td align="center">定义了_UNICODE(Unicode字符)</td></tr>
<tr>
<td align="center" width="64">TCHAR</td>
<td align="center">&nbsp;char</td>
<td align="center">&nbsp;wchar_t</td></tr>
<tr>
<td align="center" width="64" height="22">_T(x)</td>
<td align="center" height="22">&nbsp;x</td>
<td align="center" height="22">&nbsp;L##x</td></tr></tbody></table>
<p><strong>注意：<br />　　</strong>&#8220;##&#8221;是ANSI C标准的预处理语法，它叫做&#8220;粘贴符号&#8221;，表示将前面的L添加到宏参数上。也就是说，如果我们写_T(&#8220;Hello&#8221;)，展开后即为L&#8220;Hello&#8221;</p>
<p>B、实现字符串函数调用的宏</p>
<p>C++为字符串函数也定义了一系列宏，同样，我们只例举几个常用的宏：</p>
<table id="table3" style="font-size: 14px; line-height: 18pt; font-family: Tahoma; letter-spacing: 1px" width="56%" border="1">
<tbody>
<tr>
<td align="center" width="72">宏</td>
<td align="center">未定义_UNICODE(ANSI字符)</td>
<td align="center">定义了_UNICODE(Unicode字符)</td></tr>
<tr>
<td align="center" width="72">_tcschr</td>
<td align="center">&nbsp;strchr</td>
<td align="center">&nbsp;wcschr</td></tr>
<tr>
<td align="center" width="72">_tcscmp</td>
<td align="center">&nbsp;strcmp</td>
<td align="center">&nbsp;wcscmp</td></tr>
<tr>
<td align="center" width="72">_tcslen</td>
<td align="center">&nbsp;strlen</td>
<td align="center">&nbsp;wcslen</td></tr></tbody></table>
<p>四、使用Win32 API进行Unicode编程</p>
<p>Win32 API中定义了一些自己的字符数据类型。这些数据类型的定义在winnt.h头文件中。例如：</p><pre>typedef char CHAR; 
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character 
typedef CONST CHAR *LPCSTR, *PCSTR; 
</pre>Win32 API在winnt.h头文件中定义了一些实现字符和常量字符串的宏进行ANSI/Unicode通用编程。同样，只例举几个最常用的：<pre>#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
</pre>　　从以上头文件可以看出，winnt.h根据是否定义了UNICODE（没有下划线），进行条件编译。<br />　　 Win32 API也定义了一套字符串函数，它们根据是否定义了&#8220;UNICODE&#8221;分别展开为ANSI和Unicode字符串函数。如：lstrlen。API的字符串操作函数和C++的操作函数可以实现相同的功能，所以，如果需要的话，建议您尽可能使用C++的字符串函数，没必要去花太多精力再去学习API的这些东西。<br />　　也许您从来没有注意到，Win32 API实际上有两个版本。一个版本接受MBCS字符串，另一个接受Unicode字符串。例如：其实根本没有SetWindowText()这个API函数，相反，有SetWindowTextA()和SetWindowTextW()。后缀A表明这是MBCS函数，后缀W表示这是Unicode版本的函数。这些API函数的头文件在winuser.h中声明，下面例举winuser.h中的SetWindowText()函数的声明部分：<pre>#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE
</pre>　　 可见，API函数根据定义UNICODE与否决定指向Unicode版本还是MBCS版本。<br />　　细心的读者可能已经注意到了UNICODE和_UNICODE的区别，前者没有下划线，专门用于Windows头文件；后者有一个前缀下划线，专门用于C运行时头文件。换句话说，也就是在ANSI C++语言里面根据_UNICODE（有下划线）定义与否，各宏分别展开为Unicode或ANSI字符，在Windows里面根据UNICODE（无下划线）定义与否，各宏分别展开为Unicode或ANSI字符。<br />　　在后面我们将会看到，实际使用中我们不加严格区分，同时定义_UNICODE和UNICODE，以实现UNICODE版本编程。 
<p>五、VC++6.0中编写Unicode编码的应用程序</p>
<p>　　VC++ 6.0支持Unicode编程，但默认的是ANSI，所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。<br />　　使用VC++ 6.0进行Unicode编程主要做以下几项工作：</p>
<p>1、为工程添加UNICODE和_UNICODE预处理选项。</p>
<p>　　具体步骤：打开[工程]-&gt;[设置&#8230;]对话框，如图1所示，在C/C++标签对话框的&#8220;预处理程序定义&#8221;中去除_MBCS，加上_UNICODE,UNICODE。（注意中间用逗号隔开）改动后如图2：</p>
<p><img height="452" src="http://www.vckbase.com/document/journal/vckbase50/images/unicodeproimg1.gif" width="676" border="0"  alt="" /><br />图一</p>
<p><img height="454" src="http://www.vckbase.com/document/journal/vckbase50/images/unicodeproimg2.gif" width="676" border="0"  alt="" /><br />图二</p>
<p>　　在没有定义UNICODE和_UNICODE时，所有函数和类型都默认使用ANSI的版本；在定义了UNICODE和_UNICODE之后，所有的MFC类和Windows API都变成了宽字节版本了。<br /><br />2、设置程序入口点</p>
<p>　　因为MFC应用程序有针对Unicode专用的程序入口点，我们要设置entry point。否则就会出现连接错误。<br />　　设置entry point的方法是：打开[工程]-&gt;[设置&#8230;]对话框，在Link页的Output类别的Entry Point里填上wWinMainCRTStartup。</p>
<p><img height="450" src="http://www.vckbase.com/document/journal/vckbase50/images/unicodeproimg3.gif" width="676" border="0"  alt="" /><br />图三</p>
<p>3、使用ANSI/Unicode通用数据类型</p>
<p>　　微软提供了一些ANSI和Unicode兼容的通用数据类型，我们最常用的数据类型有_T ，TCHAR，LPTSTR,LPCTSTR。<br />　　顺便说一下，LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针，这是为了兼容Windows 3.1等16位操作系统遗留下来的，在Win32 中以及其它的32位操作系统中，long指针和near指针及far修饰符都是为了兼容的作用，没有实际意义。P（pointer）表示这是一个指针；C（const）表示是一个常量；T(_T宏)表示兼容ANSI和Unicode，STR（string）表示这个变量是一个字符串。综上可以看出，LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如：</p><pre>TCHAR* szText=_T(&#8220;Hello!&#8221;);
TCHAR szText[]=_T(&#8220;I Love You&#8221;);
LPCTSTR lpszText=_T(&#8220;大家好！&#8221;);
</pre>使用函数中的参数最好也要有变化，比如：<pre>MessageBox(_T(&#8220;你好&#8221;));</pre>
<p>　　其实，在上面的语句中，即使您不加_T宏，MessageBox函数也会自动把&#8220;你好&#8221;字符串进行强制转换。但我还是推荐您使用_T宏，以表示您有Unicode编码意识。</p>
<p>4、修改字符串运算问题</p>
<p>　　一些字符串操作函数需要获取字符串的字符数(sizeof(szBuffer)/sizeof(TCHAR))，而另一些函数可能需要获取字符串的字节数sizeof(szBuffer)。您应该注意该问题并仔细分析字符串操作函数，以确定能够得到正确的结果。<br />ANSI操作函数以str开头，如strcpy()，strcat()，strlen()；<br />Unicode操作函数以wcs开头，如wcscpy，wcscpy()，wcslen()；<br />ANSI/Unicode操作函数以_tcs开头 _tcscpy(C运行期库)；<br />ANSI/Unicode操作函数以lstr开头 lstrcpy(Windows函数)；<br />考虑ANSI和Unicode的兼容，我们需要使用以_tcs开头或lstr开头的通用字符串操作函数。</p>
<p>六、举个Unicode编程的例子</p>
<p>第一步：<br />　　打开VC++6.0，新建基于对话框的工程Unicode，主对话框IDD_UNICODE_DIALOG中加入一个按钮控件，双击该控件并添加该控件的响应函数：</p><pre>void CUnicodeDlg::OnButton1() 
{
	TCHAR* str1=_T("ANSI和UNICODE编码试验");
	m_disp=str1;
	UpdateData(FALSE);
}
</pre>　　 添加静态文本框IDC_DISP，使用ClassWizard给该控件添加CString类型变量m_disp。 使用默认ANSI编码环境编译该工程，生成Unicode.exe。 
<p>第二步：<br />　　打开&#8220;控制面板&#8221;，单击&#8220;日期、时间、语言和区域设置&#8221;选项，在&#8220;日期、时间、语言和区域设置&#8221;窗口中继续单击&#8220;区域和语言选项&#8221;选项，弹出&#8220;区域和语言选项&#8221;对话框。 在该对话框中，单击&#8220;高级&#8221;标签，将&#8220;非Unicode的程序的语言&#8221;选项改为&#8220;日语&#8221;，单击&#8220;应用&#8221;按钮，如图四：</p>
<p><img height="446" src="http://www.vckbase.com/document/journal/vckbase50/images/unicodeproimg4.gif" width="397" border="0"  alt="" /><br />图四</p>
<p>弹出的对话框单击&#8220;是&#8221;，重新启动计算机使设置生效。<br />运行Unicode.exe程序并单击&#8220;Button1&#8221;按钮，看，静态文本框出现了乱码。</p>
<p>第三步：<br />　　改为Unicode编码环境编译该工程，生成Unicode.exe。再次运行Unicode.exe程序并单击&#8220;Button1&#8221;按钮。看到Unicode编码的优势了吧。</p>
<p>就说这些吧，祝您好运。</p></span></span><img src ="http://www.cppblog.com/yehao/aggbug/156997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-09-27 20:05 <a href="http://www.cppblog.com/yehao/articles/156997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习BIOS与CMOS区别</title><link>http://www.cppblog.com/yehao/articles/155209.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Tue, 06 Sep 2011 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/155209.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/155209.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/155209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/155209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/155209.html</trackback:ping><description><![CDATA[<p><font face="Verdana" color="#000000"><a href="http://lipengsioc.blog.163.com/blog/static/1127009420080435636469/">http://lipengsioc.blog.163.com/blog/static/1127009420080435636469/</a><br />在日常操作和维护计算机的过程中，常常可以听到有关BIOS设置和CMOS设置的一些说法，许多人对BIOS和CMOS经常混为一谈。本文主要阐述对BIOS设置和CMOS设置在基本概念上的区分与联系。 　　</font></p>
<p><font face="Verdana" color="#000000">　　BIOS是什么?</font></p>
<p><font face="Verdana" color="#000000">　　所谓BIOS，实际上就是微机的基本输入输出系统（Basic Input－Output System），其内容集成在微机主板上的一个ROM芯片上，主要保存着有关微机系统最重要的基本输入输出程序，系统信息设置、开机上电自检程序和系统启动自举程序等。 </font></p>
<p><font face="Verdana" color="#000000">BIOS的功用 </font></p>
<p><font face="Verdana" color="#000000">　　BIOS ROM芯片不但可以在主板上看到，而且BIOS管理功能如何在很大程度上决定了主板性能是否优越。BIOS管理功能主要包括： 　　</font></p>
<p><font face="Verdana" color="#000000">　　1． BIOS中断服务程序 </font></p>
<p><font face="Verdana" color="#000000">　　BIOS中断服务程序实质上是微机系统中软件与硬件之间的一个可编程接口，主要用来在程序软件与微机硬件之间实现衔接。例如，DOS和Windows操作系统中对软盘、硬盘、光驱、键盘、显示器等外围设备的管理，都是直接建立在BIOS系统中断服务程序的基础上，而且操作人员也可以通过访问INT 5、INT 13等中断点而直接调用BIOS中断服务程序。 　　</font></p>
<p><font face="Verdana" color="#000000">　　2．BIOS系统设置程序 </font></p>
<p><font face="Verdana" color="#000000">　　微机部件配置记录是放在一块可读写的 CMOS RAM 芯片中的，主要保存着系统基本情况、CPU特性、软硬盘驱动器、显示器、键盘等部件的信息。在 BIOS ROM芯片中装有"系统设置程序"，主要用来设置CMOS RAM中的各项参数。这个程序在开机时按下某个特定键即可进入设置状态，并提供了良好的界面供操作人员使用。事实上，这个设置CMOS参数的过程，习惯上也称为" BIOS设置"。一旦CMOS RAM芯片中关于微机的配置信息不正确时，轻者会使得系统整体运行性能降低、软硬盘驱动器等部件不能识别，严重时就会由此引发一系统的软硬件故障。 </font></p>
<p><font face="Verdana" color="#000000">　　3． POST上电自检</font></p>
<p><font face="Verdana" color="#000000">　　微机按通电源后，系统首先由POST（Power On Self Test,上电自检)程序来对内部各个设备进行检查。通常完整的POST自检将包括对 CPU、640K基本内存、 1M以上的扩展内存、ROM、主板、CMOS存贮器、串并口、显示卡、软硬盘子系统及键盘进行测试，一旦在自检中发现问题，系统将给出提示信息或鸣笛警告。 　　</font></p>
<p><font face="Verdana" color="#000000">　　4． BIOS系统启动自举程序 </font></p>
<p><font face="Verdana" color="#000000">　　系统在完成 POST自检后， ROM BIOS 就首先按照系统 CMOS设置中保存的启动顺序搜寻软硬盘驱动器及CD-ROM、网络服务器等有效地启动驱动器，读入操作系统引导记录，然后将系统控制权交给引导记录，并由引导记录来完成系统的顺利启动。 </font></p>
<p><font face="Verdana" color="#000000">　　CMOS是什么? </font></p>
<p><font face="Verdana" color="#000000">　　CMOS(本意是指互补金属氧化物半导体存储嚣，是一种大规模应用于集成电路芯片制造的原料)是微机主板上的一块可读写的RAM芯片，主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。CMOS RAM芯片由系统通过一块后备电池供电，因此无论是在关机状态中，还是遇到系统掉电情况，CMOS信息都不会丢失。 </font></p>
<p><font face="Verdana" color="#000000">　　由于CMOS RAM芯片本身只是一块存储器，只具有保存数据的功能，所以对CMOS中各项参数的设定要通过专门的程序。早期的CMOS设置程序驻留在软盘上的(如IBM的PC/AT机型)，使用很不方便。现在多数厂家将CMOS设置程序做到了 BIOS芯片中，在开机时通过按下某个特定键就可进入CMOS设置程序而非常方便地对系统进行设置，因此这种CMOS设置又通常被叫做BIOS设置。 </font></p>
<p><font face="Verdana" color="#000000">BIOS设置和CMOS设置的区别与联系 </font></p>
<p><font face="Verdana" color="#000000">　　BIOS是主板上的一块EPROM或EEPROM芯片，里面装有系统的重要信息和设置系统参数的设置程序（BIOS Setup程序)；CMOS是主板上的一块可读写的RAM 芯片，里面装的是关于系统配置的具体参数，其内容可通过设置程序进行读写。CMOS RAM 芯片靠后备电池供电，即使系统掉电后信息也不会丢失。BIOS与CMOS既相关又不同：BIOS中的系统设置程序是完成CMOS参数设置的手段；CMOS RAM既是BIOS设定系统参数的存放场所，又是 BIOS设定系统参数的结果。因此，完整的说法应该是"通过BIOS设置程序对CMOS参数进行设置"。由于 BIOS和CMOS都跟系统设置密初相关，所以在实际使用过程中造成了BIOS设置和CMOS设置的说法，其实指的都是同一回事，但BIOS与CMOS却是两个完全不同的概念，千万不可搞混淆。 </font></p>
<p><font face="Verdana" color="#000000">　　何时要对BIOS或CMOS进行设置？ </font></p>
<p><font face="Verdana" color="#000000">　　众所周知，进行BIOS或CMOS设置是由操作人员根据微机实际情况而人工完成的一项十分重要的系统初始化工作。在以下情况下，必须进行BIOS或CMOS进行设置： </font></p>
<p><font face="Verdana" color="#000000">　　1、新购微机</font></p>
<p><font face="Verdana" color="#000000">　　即使带PnP功能的系统也只能识别一部分微机外围设备，而对软硬盘参数、当前日期、时钟等基本资料等必须由操作人员进行设置，因此新购买的微机必须通过进行CMOS参数设置来告诉系统整个微机的基本配置情况。 </font></p>
<p><font face="Verdana" color="#000000">　　2．新增设备 </font></p>
<p><font face="Verdana" color="#000000">　　由于系统不一定能认识新增的设备，所以必须通过CMOS设置来告诉它。另外，一旦新增设备与原有设备之间发生了IRQ、DMA冲突，也往往需要通过BIOS设置来进行排除。 </font></p>
<p><font face="Verdana" color="#000000">　　3．CMOS数据意外丢失</font></p>
<p><font face="Verdana" color="#000000">　　在系统后备电池失效、病毒破坏了 CMOS数据程序、意外清除了CMOS参数等情况下，常常会造成CMOS数据意外丢失。此时只能重新进入BIOS设置程序完成新的CMOS参数设置。 </font></p>
<p><font face="Verdana" color="#000000">　　4．系统优化 </font></p>
<p><font face="Verdana" color="#000000">　　对于内存读写等待时间、硬盘数据传输模式、内／外 Cache的使用、节能保护、电源管理、开机启动顺序等参数， BIOS中预定的设置对系统而言并不一定就是最优的，此时往往需要经过多次试验才能找到系统优化的最佳组合</font></p><img src ="http://www.cppblog.com/yehao/aggbug/155209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-09-06 14:39 <a href="http://www.cppblog.com/yehao/articles/155209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软压缩和硬压缩</title><link>http://www.cppblog.com/yehao/articles/155208.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Tue, 06 Sep 2011 06:38:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/155208.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/155208.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/155208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/155208.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/155208.html</trackback:ping><description><![CDATA[<p><font face="Verdana" color="#000000">如何选择软压缩与硬压缩DVR卡</font></p>
<p><font face="Verdana" color="#000000">最近很多国内外客户，向我问到软压缩与硬压缩的区别与选择的问题，今天我在这里将对软压缩卡与硬压缩卡做一个对比分析与介绍。</font></p>
<p><font face="Verdana" color="#000000">（一）软压缩DVR卡与硬压缩卡</font></p>
<p><font face="Verdana" color="#000000">软压缩卡，也称视频采集卡，该电路板卡主要是由1个或多个视频采集芯片及周边元件、电路组成，电路结构比硬压缩简单，成本也远低于硬压缩。这种卡只负责采集视频，而视频压缩、解压缩及其他视频处理则是由CPU运算实现。</font></p>
<p><font face="Verdana" color="#000000">硬压缩卡，也称视频采集压缩卡，该电路板卡与软压缩卡不同的是，多了视频压缩与解压缩部分电路结构，视频压缩没有交给电脑CPU去处理，而是交个DSP芯片去处理的。所以硬压缩卡电路更复杂。</font></p>
<p><font face="Verdana" color="#000000">（二）软压缩DVR卡与硬压缩卡主要开发商</font></p>
<p><font face="Verdana" color="#000000">软压缩DVR卡硬件比较简单，软压缩卡很少有芯片商提供开发包的，一般都需要自己公司完全自主开发，所以开发难度较大，拥有完全自主开发能力的软压缩卡研发商不多，主要有台湾奇偶、韩国Kodicom、与我国的深圳波粒智能等。</font></p>
<p><font face="Verdana" color="#000000">硬压缩卡厂商门大多是采用芯片厂商提供的驱动与SDK开发包，进行二次开发，然后再整理出自己的开发包，又提供给下一级软件开发商做三次开发。由于有芯片制造商提供了完善的开发包，所以开发难度相对较小，国内出现了一大批硬压缩厂商，如：杭州海康威视、成都德加拉、武汉恒亿、广州金鹏、深圳图敏、杭州星辉等。</font></p>
<p><font face="Verdana" color="#000000">（三）软压缩DVR卡与硬压缩卡优势对比</font></p>
<p><font face="Verdana" color="#000000">1）使用寿命</font></p>
<p><font face="Verdana" color="#000000">DVR产品更新换代快，变化最快的是压缩算法与软件功能部分，软压缩卡（这里指的是正版软压缩卡）灵活性强，它没有把软件与压缩算法部分没有固化在芯片里，升级灵活，不容易被淘汰掉，一旦有更高效率的压缩算法，很快可以通过免费软件升级而提高您的DVR质量，而硬压缩DVR是将压缩算法写入DSP芯片，升级麻烦，使用寿命短，众所周知，前几年的价值高达几千甚至一万元以上的MPEG-1硬压缩卡，使用不到一年就因为无法升级而淘汰了</font></p>
<p><font face="Verdana" color="#000000">2）压缩效率 </font></p>
<p><font face="Verdana" color="#000000">在视频压缩能力方面，硬压缩优于软压缩。软压缩卡由于利用CPU压缩，消耗电脑资源，合理配置电脑是软压缩DVR长期稳定运行的关键。随市场主流CPU性能与速度加快，软压缩处理能力也随着加强，采用普通的赛扬1.7G就能压缩4-8路（352 X 288）实时，一旦不久的将来64位Windows操作系统面市，软压缩卡采用廉价AMD64位CPU压缩视频，就成了轻轻松松的事情，压缩32路实时将不再是难题了。到了这时软压缩将可能取代硬压缩卡。</font></p>
<p><font face="Verdana" color="#000000">在压缩比方面，市面上常见的很多软压缩DVR卡是国外早期产品，它们采用的是小波算法甚至MJPEG，消耗硬盘大，网络性能差，但最近新推出软压缩DVR卡大多是采用MPEG-4或者 H.264算法，每路每小时占硬盘30-150M。</font></p>
<p><font face="Verdana" color="#000000">3）硬件成本</font></p>
<p><font face="Verdana" color="#000000">在板卡成本与价格方面，软压缩卡有明显优势，软压缩卡价格一般只有硬压缩卡的1/4~1/3。</font></p>
<p><font face="Verdana" color="#000000">4）图象质量</font></p>
<p><font face="Verdana" color="#000000">在图象质量方面，主要决定视频采集芯片、电路抗躁、分辨率与压缩算法，其中压缩算法、压缩比决定回放DVR录象的画质，市面上销售的一些盗版Kodicom与Pico等国外早期软压缩卡，由于采用8比特的FUSION878A 作视频采集芯片，图象质量不如采用PHILIPS芯片的硬压缩卡，但软压缩也有采用PHILIPS7130、7134芯片，如Ether 9404 DVR卡，这种卡的预览画质与硬压缩卡基本一样，但录象画质超过通常的硬压缩卡。</font></p>
<p><font face="Verdana" color="#000000">5）网络性能</font></p>
<p><font face="Verdana" color="#000000">在网络方面，软压缩大多做得比硬压缩卡更好，也许是因为开发软压缩DVR厂家研发实力更强大吧，但网络性能确实与软压缩或硬压缩无关，网络性能好坏与压缩算法有关，先进的压缩算法由于压缩比大，数据流量小，对带宽要求低，网络性能则更好。</font></p><img src ="http://www.cppblog.com/yehao/aggbug/155208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-09-06 14:38 <a href="http://www.cppblog.com/yehao/articles/155208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络管理之ICMP协议篇</title><link>http://www.cppblog.com/yehao/articles/151978.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Thu, 28 Jul 2011 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/151978.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/151978.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/151978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/151978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/151978.html</trackback:ping><description><![CDATA[<p>转自<a href="http://www.pconline.com.cn/pcedu/soft/lan/jywrm/10306/179145_1.html">http://www.pconline.com.cn/pcedu/soft/lan/jywrm/10306/179145_1.html</a><br /><br />对TCP/IP协议你一定非常熟悉，但是对ICMP协议你可能就一无所知了。ICMP协议是一个非常重要的协议，它对于网络安全具有极其重要的意义。下面我们就来谈谈ICMP协议。<br /><br /><br />　　<strong>什么是ICMP协议</strong><br /><br /><br />　　ICMP是&#8220;Internet Control Message Protocol&#8221;（Internet控制消息协议）的缩写。它是TCP/IP协议族的一个子协议，用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据，但是对于用户数据的传递起着重要的作用。<br /><br />　　我们在网络中经常会使用到ICMP协议，只不过我们觉察不到而已。比如我们经常使用的用于检查网络通不通的Ping命令，这个&#8220;Ping&#8221;的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。<br /><br /><br />　　<strong>ICMP的重要性</strong><br /><br /><br />　　ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。例如，在1999年8月海信集团&#8220;悬赏&#8221;50万元人民币测试防火墙的过程中，其防火墙遭受到的ICMP攻击达334050次之多，占整个攻击总数的90%以上！可见，ICMP的重要性绝不可以忽视！<br /><br />　　比如，可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定，向主机发起&#8220;Ping of Death&#8221;（死亡之Ping）攻击。&#8220;Ping of Death&#8221; 攻击的原理是：如果ICMP数据包的尺寸超过64KB上限时，主机就会出现内存分配错误，导致TCP/IP堆栈崩溃，致使主机死机。<br /><br />　　此外，向目标主机长时间、连续、大量地发送ICMP数据包，也会最终使系统瘫痪。大量的ICMP数据包会形成&#8220;ICMP风暴&#8221;，使得目标主机耗费大量的CPU资源处理，疲于奔命。<br /><br /><br />　　<strong>应对ICMP攻击</strong><br /><br /><br />　　虽然ICMP协议给黑客以可乘之机，但是ICMP攻击也并非无药可医。只要在日常网络管理中未雨绸缪，提前做好准备，就可以有效地避免ICMP攻击造成的损失。<br />对于&#8220;Ping of Death&#8221;攻击，可以采取两种方法进行防范：第一种方法是在路由器上对ICMP数据包进行带宽限制，将ICMP占用的带宽控制在一定的范围内，这样即使有ICMP攻击，它所占用的带宽也是非常有限的，对整个网络的影响非常少；第二种方法就是在主机上设置ICMP数据包的处理规则，最好是设定拒绝所有的ICMP数据包。<br /><br />　　设置ICMP数据包处理规则的方法也有两种，一种是在操作系统上设置包过滤，另一种是在主机上安装防火墙。具体设置如下：<br /><br />　　1．在Windows 2000 Server中设置ICMP过滤<br /><br />　　Windows 2000 Server提供了&#8220;路由与远程访问&#8221;服务，但是默认情况下是没有启动的，因此首先要启动它：点击&#8220;管理工具&#8221;中的&#8220;路由与远程访问&#8221;，启动设置向导。在其中选择&#8220;手动配置服务器&#8221;项，点击[下一步]按钮。稍等片刻后，系统会提示&#8220;路由和远程访问服务现在已被安装。要开始服务吗？&#8221;，点击[是]按钮启动服务。<br /><br />　　服务启动后，在计算机名称的分支下会出现一个&#8220;IP路由选择&#8221;，点击它展开分支，再点击&#8220;常规&#8221;，会在右边出现服务器中的网络连接（即网卡）。用鼠标右键点击你要配置的网络连接，在弹出的菜单中点击&#8220;属性&#8221;，会弹出一个网络连接属性的窗口，如图1所示。<br /><br /></p>
<p align="center"><img src="http://www.pconline.com.cn/pcedu/soft/lan/jywrm/10306/pic/20030612zw_01.jpg"  alt="" /></p>
<p><br />　　图1<br /><br />　　图1中有两个按钮，一个是&#8220;输入筛选器&#8221;（指对此服务器接受的数据包进行筛选），另一个是&#8220;输出筛选器&#8221;（指对此服务器发送的数据包进行筛选），这里应该点击[输入筛选器] 按钮，会弹出一个&#8220;添加筛选器&#8221;窗口，再点击[添加]按钮，表示要增加一个筛选条件。<br /><br />　　在&#8220;协议&#8221;右边的下拉列表中选择&#8220;ICMP&#8221;，在随后出现的&#8220;ICMP类型&#8221;和&#8220;ICMP编码&#8221;中均输入&#8220;255&#8221;，代表所有的ICMP类型及其编码。ICMP有许多不同的类型（Ping就是一种类型），每种类型也有许多不同的状态，用不同的&#8220;编码&#8221;来表示。因为其类型和编码很复杂，这里不再叙述。<br /><br />　　点击[确定]按钮返回&#8220;输入筛选器&#8221;窗口，此时会发现&#8220;筛选器&#8221;列表中多了一项内容（如图2所示）。点击[确定]按钮返回&#8220;本地连接&#8221;窗口，再点击[确定]按钮，此时筛选器就生效了，从其他计算机上Ping这台主机就不会成功了。<br /><br /></p>
<p align="center"><img src="http://www.pconline.com.cn/pcedu/soft/lan/jywrm/10306/pic/20030612zw_02.jpg"  alt="" /></p>
<p><br />　　图2<br /><br />　　2． 用防火墙设置ICMP过滤<br /><br />　　现在许多防火墙在默认情况下都启用了ICMP过滤的功能。如果没有启用，只要选中&#8220;防御ICMP攻击&#8221;、&#8220;防止别人用ping命令探测&#8221;就可以了，如图3所示。<br /><br /></p>
<p align="center"><img src="http://www.pconline.com.cn/pcedu/soft/lan/jywrm/10306/pic/20030612zw_03.jpg"  alt="" /></p>
<p><br />　　图3<br /><br />　　通过以上讲解，你现在知道ICMP的重要性了吧？赶紧给你的服务器设置ICMP过滤吧。<br /></p><img src ="http://www.cppblog.com/yehao/aggbug/151978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-07-28 14:21 <a href="http://www.cppblog.com/yehao/articles/151978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICMP与IGMP的区别</title><link>http://www.cppblog.com/yehao/articles/145652.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Wed, 04 May 2011 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/145652.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/145652.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/145652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/145652.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/145652.html</trackback:ping><description><![CDATA[<p>ICMP与IGMP的区别</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ICMP协议，英文全称（Internet Control Message Protocol），就是网际控制信息协议。主要是用于补充IP传输数据报的过程中，发送主机无法确定数据报是否到达目标主机。ICMP报文分为出错报告报文和查询报文两种。若数据报不能到达目标主机，ICMP出错报告报文可以以回送信息的方式，向源主机发去信息，并不能纠正数据报中的任何出错。除了出错报告，ICMP还可以诊断出某些网络问题，这就是ICMP的查询报文。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IGMP协议，英文全称（Internet Group Management Protocol），网络组管理协议。主要用于建立和管理多播组，对IP分组广播进行控制。</p>
<p>internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。 </p>
<p>IP运用互联组管理协议IGMP来告诉路由器，某一网络上指导组中的可用主机。 </p>
<p>ICMP <br>ICMP源抑制消息：当TCP/IP主机发送数据到另一主机时，如果速度达到路由器或者链路的饱和状态，路由器发出一个ICMP源抑制消息。 <br>ICMP数据包结构 <br>类型：一个8位类型字段，表示ICMP数据包类型。 <br>代码：一个8位代码域，表示指定类型中的一个功能。如果一个类型中只有一种功能，代码域置为0。 <br>检验和：数据包中ICMP部分上的一个16位检验和。 <br>指定类型的数据随每个ICMP类型变化的一个附加数据。 </p>
<p>IGMP <br>IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。 <br>IGMP包结构 <br>版本：IGMP的版本，值一般为0x1h。 <br>类型：IGMP消息的类型。0x1h类型称为主机成员请求，在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告，在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。 <br>未用：未用的域名被发送者置零且被接收者忽略。 <br>检验和：IGMP头的一个16位检验和。 <br>组地址：主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中，组地址被全置零，而且硬件级的多路广播地址被用来标示主机组。<br></p>
<img src ="http://www.cppblog.com/yehao/aggbug/145652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-05-04 13:22 <a href="http://www.cppblog.com/yehao/articles/145652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大端(Big Endian)与小端(Little Endian)详解</title><link>http://www.cppblog.com/yehao/articles/145454.html</link><dc:creator>厚积薄发</dc:creator><author>厚积薄发</author><pubDate>Sun, 01 May 2011 06:43:00 GMT</pubDate><guid>http://www.cppblog.com/yehao/articles/145454.html</guid><wfw:comment>http://www.cppblog.com/yehao/comments/145454.html</wfw:comment><comments>http://www.cppblog.com/yehao/articles/145454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehao/comments/commentRss/145454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehao/services/trackbacks/145454.html</trackback:ping><description><![CDATA[<p>转自<a href="http://hi.baidu.com/serial_story/blog/item/7e110587c3ed8e29c75cc3c7.html">http://hi.baidu.com/serial_story/blog/item/7e110587c3ed8e29c75cc3c7.html</a><br><br>【大端(Big Endian)与小端(Little Endian)简介】<br>Byte Endian是指字节在内存中的组织，所以也称它为Byte Ordering，或Byte Order。 <br>&nbsp;&nbsp;&nbsp;&nbsp; 对于数据中跨越多个字节的对象， 我们必须为它建立这样的约定:<br>(1) 它的地址是多少?<br>(2) 它的字节在内存中是如何组织的?<br>&nbsp;&nbsp;&nbsp; 针对第一个问题，有这样的解释:<br>&nbsp;&nbsp;&nbsp; 对于跨越多个字节的对象，一般它所占的字节都是连续的，它的地址等于它所占字节最低地址。(链表可能是个例外， 但链表的地址可看作链表头的地址)。<br>&nbsp;&nbsp;&nbsp; 比如: int x， 它的地址为0x100。 那么它占据了内存中的Ox100， 0x101， 0x102， 0x103这四个字节（32位系统，所以int占用4个字节）。<br>&nbsp;&nbsp;&nbsp; 上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。<br>&nbsp;&nbsp;&nbsp; 它的各位表达如下:[Xw-1， Xw-2， ... ， X1， X0],它的<br>&nbsp;&nbsp;&nbsp; MSB (Most Significant Byte， 最高有效字节)为 [Xw-1， Xw-2， ... Xw-8];<br>&nbsp;&nbsp;&nbsp; LSB (Least Significant Byte， 最低有效字节)为 [X7，X6，...， X0]。 <br>&nbsp;&nbsp;&nbsp; 其余的字节位于MSB， LSB之间。</p>
<p>LSB和MSB谁位于内存的最低地址， 即谁代表该对象的地址? <br>这就引出了大端(Big Endian)与小端(Little Endian)的问题。<br>如果LSB在MSB前面， 既LSB是低地址， 则该机器是小端; 反之则是大端。<br><font color=#800080><strong>DEC (Digital Equipment Corporation，现在是Compaq公司的一部分)和Intel的机器（X86平台）一般采用小端。<br>IBM， Motorola(Power PC)， Sun的机器一般采用大端。<br>当然，这不代表所有情况。有的CPU即能工作于小端， 又能工作于大端， 比如ARM， Alpha，摩托罗拉的PowerPC。 具体情形参考处理器手册。</strong><br></font>具体这类CPU是大端还是小端，应该和具体设置有关。<br>（如，Power PC支持little-endian字节序，但在默认配置时是big-endian字节序）<br>一般来说，大部分用户的操作系统（如windows, FreeBsd,Linux）是Little Endian的。少部分，如MAC OS ,是Big Endian 的。<br>所以说，Little Endian还是Big Endian与操作系统和芯片类型都有关系。</p>
<p>Linux系统中，你可以在/usr/include/中（包括子目录）查找字符串BYTE_ORDER(或<br>_BYTE_ORDER, __BYTE_ORDER)，确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中，不同的操作系统可能有所不同。</p>
<p>对于一个数0x1122<br>使用Little Endian方式时，低字节存储0x22，高字节存储0x11<br>而使用Big Endian方式时, 低字节存储0x11, 高字节存储0x22</p>
<p>&#160;</p>
<p>经一网友指正,才知道,上面的描述,是不准确的.</p>
<p>想了下,觉得如下描述可能更合适:</p>
<p><font color=#0000ff><strong>使用Little Endian方式存储数据时,数据的LSB相对最没意义的数据位,存放在低地址位置,这里的LSB也就是22了.也即,</strong></font></p>
<p><font color=#0000ff><strong>低地址存储0x22, 高地址存储0x11</strong></font></p>
<p><font color=#0000ff><strong>而使用Big Endian方式存储数据时,数据的MSB最有意义的数据位,存放在低地址位置,这里的MSB也就是11了.也即</strong></font></p>
<p><font color=#0000ff><strong>低地址存储0x11, 高地址存储0x22</strong></font></p>
<p>助记:</p>
<p>1)所谓MSB (Most Significant Byte),名字很复杂,不知是否有人没搞懂,反正我开始看到这个词时候,就很糊涂,有点不完全理解.其实简单说MSB就是,一个数字中,最重要的那位,</p>
<p>举例来说,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.</p>
<p>2)一般常见的数据存储,用文字写出来的时候,其内容书写格式,多数是从低地址到高地址.</p>
<p>举例,一个16进制数是 0x11 22 33, 而存放的位置是</p>
<p>地址0x3000 中存放11</p>
<p>地址0x3001 中存放22</p>
<p>地址0x3002 中存放33</p>
<p>连起来就写成地址0x3000-0x3002中存放了数据0x112233.</p>
<p>而这种存放和表示方式,正好符合大端.</p>
<p>解释的有点乱,希望有人能看懂.</p>
<p>&#160;</p>
<p>如果还有哪里有误,还请各位继续指正.谢谢.</p>
<p>&#160;</p>
<p>&#160;</p>
<p><strong><font color=#0000ff>【用函数判断系统是Big Endian还是Little Endian】<br></font></strong>bool IsBig_Endian()<br>//如果字节序为big-endian，返回true;<br>//反之为&nbsp;&nbsp; little-endian，返回false<br>{<br>&nbsp;&nbsp;&nbsp; unsigned short test = 0x1122;<br>&nbsp;&nbsp;&nbsp; if(*( (unsigned char*) &amp;test ) == 0x11)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>else<br>&nbsp;&nbsp;&nbsp; return FALSE;</p>
<p>}//IsBig_Endian()</p>
<img src ="http://www.cppblog.com/yehao/aggbug/145454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehao/" target="_blank">厚积薄发</a> 2011-05-01 14:43 <a href="http://www.cppblog.com/yehao/articles/145454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>