<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	<channel>
		<title>有空来玩玩的Blog</title>
		<link>http://blog.joy999.com//</link>
		<description>人一生这一辈子，能记住多少事？还是写下来的好。</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Tue, 07 Sep 2010 21:52:29 +0000</lastBuildDate>
		<ttl>30</ttl>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/joy999/blog" /><feedburner:info uri="joy999/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
			<guid isPermaLink="false">http://blog.joy999.com//show-217-1.html</guid>
			<title>【转】denyhost防止SSH暴力破解，保护你的linux</title>
			<author>有空来玩玩</author>
			<description>&lt;div id="cke_pastebin"&gt;本文介绍了linux下使用denyhost防止ssh暴力破解，保护linux安全。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;工作中的linux服务器每天都会有无数的SSH失败尝试记录，有些人一直不停的扫描，使用软件在那里穷举扫描,所以大家第一要记的设置一个好的够复杂的密码。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;怎么样防,如果要一条一条将这些IP阻止显然治标不治本，还好有DenyHosts软件来代替我们手搞定他。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;DenyHosts是Python语言写的一个程序，它会分析sshd的日志文件，当发现重复的攻击时就会记录IP到/etc/hosts.deny文件，从而达到自动屏IP的功能。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;DenyHosts官方网站为：http://denyhosts.sourceforge.net&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;以下是安装记录（以CentOS 4.8, DenyHosts 2.6 为例）&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;1.安装&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;# tar -zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6
# python setup.py install&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;默认是安装到/usr/share/denyhosts目录的。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;2.配置&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;# vi denyhosts.cfg&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;根据自己需要进行相应的配置&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;SECURE_LOG = /var/log/secure
#ssh 日志文件，它是根据这个文件来判断的。
HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件
PURGE_DENY = 5m
#过多久后清除已经禁止的
BLOCK_SERVICE  = sshd
#禁止的服务名
DENY_THRESHOLD_INVALID = 1
#允许无效用户失败的次数
DENY_THRESHOLD_VALID = 5
#允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数
HOSTNAME_LOOKUP=NO
#是否做域名反解
ADMIN_EMAIL = admin@yahunet.com
#管理员邮件地址,它会给管理员发邮件
DAEMON_LOG = /var/log/denyhosts
#自己的日志文件&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;3.设置启动脚本&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;# cp daemon-control-dist daemon-control
# chown root daemon-control
# chmod 700 daemon-control&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;完了之后执行daemon-contron start就可以了。&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;# ./daemon-control start&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;如果要使DenyHosts每次重起后自动启动还需做如下设置：&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;# ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
# chkconfig --add denyhosts
# chkconfig  denyhosts on&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;然后就可以启动了：&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;
&lt;pre class="quote"&gt;# service denyhosts start&lt;/pre&gt;
&lt;/div&gt;
&lt;div id="cke_pastebin"&gt;可以看看/etc/hosts.deny内是否有禁止的IP，有的话说明已经成功了。&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VdGNBe4qnRnQOt916jFowJKQijo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VdGNBe4qnRnQOt916jFowJKQijo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VdGNBe4qnRnQOt916jFowJKQijo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VdGNBe4qnRnQOt916jFowJKQijo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/j4Ci0T5GjMA" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/j4Ci0T5GjMA/show-217-1.html</link>
			<category domain="http://blog.joy999.com//category-6-1.html">操作系统</category>
			<pubDate>2010-08-16 15:34</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-217-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-216-1.html</guid>
			<title>errno.h的真正位置</title>
			<author>有空来玩玩</author>
			<description>今天找了N久，终于找到它的真正位置了，马上记录下来。免得下次再找。

/usr/include/asm-generic
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nat4tTtVbBKQvtQrTs7k_ogQzEg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nat4tTtVbBKQvtQrTs7k_ogQzEg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nat4tTtVbBKQvtQrTs7k_ogQzEg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nat4tTtVbBKQvtQrTs7k_ogQzEg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/Wmik8uf8lso" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/Wmik8uf8lso/show-216-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-08-03 15:29</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-216-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-215-1.html</guid>
			<title>【转】百万用户级游戏服务器架构设计</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;&lt;span style="text-align: left; widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 12px/18px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"&gt;&lt;strong&gt;服务器结构探讨 -- 最简单的结构&lt;/strong&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　所谓服务器结构，也就是如何将服务器各部分合理地安排，以实现最初的功能需求。所以，结构本无所谓正确与错误；当然，优秀的结构更有助于系统的搭建，对系统的可扩展性及可维护性也有更大的帮助。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　好的结构不是一蹴而就的，而且每个设计者心中的那把尺都不相同，所以这个优秀结构的定义也就没有定论。在这里，我们不打算对现有游戏结构做评价，而是试着从头开始搭建一个我们需要的MMOG结构。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　对于一个最简单的游戏服务器来说，它只需要能够接受来自客户端的连接请求，然后处理客户端在游戏世界中的移动及交互，也即游戏逻辑处理即可。如果我们把这两项功能集成到一个服务进程中，则最终的结构很简单：&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　client ----- server&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　嗯，太简单了点，这样也敢叫服务器结构？好吧，现在我们来往里面稍稍加点东西，让它看起来更像是服务器结构一些。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　一般来说，我们在接入游戏服务器的时候都会要提供一个帐号和密码，验证通过后才能进入。关于为什么要提供用户名和密码才能进入的问题我们这里不打算做过多讨论，云风曾对此也提出过类似的疑问，并给出了只用一个标识串就能进入的设想，有兴趣的可以去看看他们的讨论。但不管是采用何种方式进入，照目前看来我们的服务器起码得提供一个帐号验证的功能。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　我们把观察点先集中在一个大区内。在大多数情况下，一个大区内都会有多组游戏服，也就是多个游戏世界可供选择。简单点来实现，我们完全可以抛弃这个大区的概念，认为一个大区也就是放在同一个机房的多台服务器组，各服务器组间没有什么关系。这样，我们可为每组服务器单独配备一台登录服。最后的结构图应该像这样：&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　loginServer&amp;nbsp;&amp;nbsp; gameServer&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
　　　　　|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
　　　　　|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
　　　　　client&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　该结构下的玩家操作流程为，先选择大区，再选择大区下的某台服务器，即某个游戏世界，点击进入后开始帐号验证过程，验证成功则进入了该游戏世界。但是，如果玩家想要切换游戏世界，他只能先退出当前游戏世界，然后进入新的游戏世界重新进行帐号验证。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　早期的游戏大都采用的是这种结构，有些游戏在实现时采用了一些技术手段使得在切换游戏服时不需要再次验证帐号，但整体结构还是未做改变。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　该结构存在一个服务器资源配置的问题。因为登录服处理的逻辑相对来说比较简单，就是将玩家提交的帐号和密码送到数据库进行验证，和生成会话密钥发送给游戏服和客户端，操作完成后连接就会立即断开，而且玩家在以后的游戏过程中不会再与登录服打任何交道。这样处理短连接的过程使得系统在大多数情况下都是比较空闲的，但是在某些时候，由于请求比较密集，比如开新服的时候，登录服的负载又会比较大，甚至会处理不过来。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
　　另外在实际的游戏运营中，有些游戏世界很火爆，而有些游戏世界却非常冷清，甚至没有多少人玩的情况也是很常见的。所以，我们能否更合理地配置登录服资源，使得整个大区内的登录服可以共享就成了下一步改进的目标。&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-215-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1H9yptkT-RaZ16BhUzMMQp6njrM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1H9yptkT-RaZ16BhUzMMQp6njrM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1H9yptkT-RaZ16BhUzMMQp6njrM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1H9yptkT-RaZ16BhUzMMQp6njrM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/WzFj671R_gc" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/WzFj671R_gc/show-215-1.html</link>
			<category domain="http://blog.joy999.com//category-3-1.html">服务器相关</category>
			<pubDate>2010-08-02 15:59</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-215-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-214-1.html</guid>
			<title>【转】Linux下用C语言API连接MySQL数据库</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;编译和连接程序&lt;/p&gt;
&lt;p&gt;　　MySQL中有一个特殊的脚本,叫做mysql_config. 它会为你编译MySQL客户端,并连接到MySQL服务器提供有用的信息.你需要使用下面两个选项.&lt;/p&gt;
&lt;p&gt;　　1. --libs 选项 - 连接MySQL客户端函数库所需要的库和选项.&lt;/p&gt;
&lt;p&gt;　　$ mysql_config --libs&lt;/p&gt;
&lt;p&gt;　　输出:&lt;/p&gt;
&lt;p&gt;　　-L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-214-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s1pI-3ywV3pSqrTt24l90b6qPx0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s1pI-3ywV3pSqrTt24l90b6qPx0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s1pI-3ywV3pSqrTt24l90b6qPx0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s1pI-3ywV3pSqrTt24l90b6qPx0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/N8yd-3uBF4o" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/N8yd-3uBF4o/show-214-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-07-06 16:22</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-214-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-213-1.html</guid>
			<title>【转】accept详细说明</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;&lt;font face="Courier New"&gt;DESCRIPTION 描述&lt;br /&gt;
&lt;span style="color: #ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; accept&lt;/span&gt; 函数用于基于连接的套接字 &lt;span style="color: #0000cc"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;SOCK_STREAM&lt;/span&gt;&lt;span style="color: #0000cc"&gt;,&lt;/span&gt; &lt;span style="color: #ff0000"&gt;SOCK_SEQPACKET&lt;/span&gt; 和 &lt;span style="color: #ff0000"&gt;SOCK_RDM&lt;/span&gt;&lt;span style="color: #0000cc"&gt;)&lt;/span&gt;&lt;span style="color: #0000cc"&gt;.&lt;/span&gt; 它从未完成连接队列中取出第一个连接请求&lt;span style="color: #0000cc"&gt;,&lt;/span&gt;创建一个和参数 s 属性相同的连接套接字&lt;span style="color: #0000cc"&gt;,&lt;/span&gt;并为这个套接字分配一个文件描述符&lt;span style="color: #0000cc"&gt;,&lt;/span&gt; 然后以这个描述符返回&lt;span style="color: #0000cc"&gt;.&lt;/span&gt;新创建的描述符不再处于倾听状态&lt;span style="color: #0000cc"&gt;.&lt;/span&gt;原套接字 s 不受此调用的影响&lt;span style="color: #0000cc"&gt;.&lt;/span&gt;注意任意一个文件描述符标志 &lt;span style="color: #0000cc"&gt;(&lt;/span&gt;任何可以被 fcntl以参数 F_SETFL 设置的值&lt;span style="color: #0000cc"&gt;,&lt;/span&gt;比如非阻塞式或者异步状态&lt;span style="color: #0000cc"&gt;)&lt;/span&gt;不会被 &lt;span style="color: #ff0000"&gt;accept&lt;/span&gt;&lt;span style="color: #0000cc"&gt;.&lt;/span&gt; 所继承&lt;span style="color: #0000cc"&gt;.&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-213-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rgyC7lnqUk9YYbFVUWUdgoPCees/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rgyC7lnqUk9YYbFVUWUdgoPCees/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rgyC7lnqUk9YYbFVUWUdgoPCees/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rgyC7lnqUk9YYbFVUWUdgoPCees/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/EPFhQEv-AfU" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/EPFhQEv-AfU/show-213-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-07-06 01:10</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-213-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-212-1.html</guid>
			<title>【转】Linux使用vmplayer跑windows环境一个字,爽</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;　　vmware提供了一个free的vmplayer软件,通过&lt;a href="http://www.vmware.com/vmplayer" target="_blank"&gt;&lt;font color="#22229c"&gt;http://www.vmware.com/vmplayer&lt;/font&gt;&lt;/a&gt;下载linux版，安装。使用&lt;a href="http://www.easyvmx.com/" target="_blank"&gt;&lt;font color="#22229c"&gt;http://www.easyvmx.com&lt;/font&gt;&lt;/a&gt;生成一个合适的虚拟配置。加载虚拟机以后，安装windows2k as。好处非常明显，使用本机iso文件虚拟光盘读操作，速度飞快，安装中的格式化硬盘等操作都可以放心测试...&lt;br /&gt;
&lt;br /&gt;
　　几个不常被用到的有用配置记录如下：&lt;br /&gt;
&lt;br /&gt;
　　一、硬盘还原卡功能：&lt;br /&gt;
　　打完补丁等之后，将vmx文件中的ide0:0.mode改为&amp;quot;independent-nonpersistent&amp;quot;一台装有硬盘还原卡的系统就做好了。以后不论把虚拟机中的系统怎么折腾。重启虚拟系统，又一切还原！&lt;br /&gt;
&lt;br /&gt;
　　二、1000M网卡功能：&lt;br /&gt;
　　将网卡配置由原来的ethernet0.virtualDev = &amp;quot;vlance&amp;quot;改为&amp;quot;vmxnet&amp;quot;再通过从vmware server中分离出来的iso加载驱动即可获得1000M网卡特性&lt;br /&gt;
&lt;br /&gt;
　　三、虚拟机中启动真实硬盘的系统：&lt;br /&gt;
　　在很多网络资源上提供的方法是使用vmware workstation版本通过一些选项的选择来实现。通过试验，通过修改vmx文件的DeviceType为raw-disk和vmdk文件中的硬盘参数与真实硬盘一致就可以装载真实硬盘上的系统。当机算机安装双系统的时候，可在不刻碟的情况下修订或安装新版系统。甚至于可以使用linux的虚拟机修复和引导同一机器上的windows系统。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vukfEmzjKOtOs1ESJGCLsfJores/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vukfEmzjKOtOs1ESJGCLsfJores/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vukfEmzjKOtOs1ESJGCLsfJores/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vukfEmzjKOtOs1ESJGCLsfJores/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/8VcDdbetXNI" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/8VcDdbetXNI/show-212-1.html</link>
			<category domain="http://blog.joy999.com//category-6-1.html">操作系统</category>
			<pubDate>2010-06-29 11:34</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-212-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-211-1.html</guid>
			<title>【转】Thinkpad T400 X200 带迅盘 WINDOWS7 关机慢的解决办法</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;首先把机器上原来带的迅盘驱动删除掉&lt;br /&gt;
&lt;br /&gt;
然后下载INTEL 迅盘的最新驱动&lt;br /&gt;
&lt;a href="http://downloadmirror.intel.com/18011/a08/INVM110CD.exe" target="_blank"&gt;&lt;font color="#0070af"&gt;http://downloadmirror.intel.com/18011/a08/INVM110CD.exe&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
然后在点开始---运行----CDM 命令提示符里面运行文件的up参数。&lt;br /&gt;
例如D:\INVM110CD.exe -up（'.exe'和'-up'间有空格）&lt;br /&gt;
安装的时候就会安装成完全版本，即 会一起安装 turbe momery dashboard 这个软件，这个软件只有在4G讯盘上才会自动安装，而它则可以让用户设置哪些需要讯盘加速，那些不需要。如果没有安装这个软件，电脑就会随机加速某个运用软件。 &lt;br /&gt;
在安装玩这个软件后，打开turbo momery控制台的时候，会发现 ready boost 这个选项是灰色不可选的。 &lt;br /&gt;
在这种情况下，2G讯盘用户就最大化利用了讯盘这一功能，并将讯盘导致关机缓慢的情况杜绝了。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HFxvPFt462Hm9v86UMusJr5n65Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HFxvPFt462Hm9v86UMusJr5n65Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HFxvPFt462Hm9v86UMusJr5n65Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HFxvPFt462Hm9v86UMusJr5n65Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/bt3cUOBoczQ" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/bt3cUOBoczQ/show-211-1.html</link>
			<category domain="http://blog.joy999.com//category-9-1.html">计算机硬件</category>
			<pubDate>2010-06-25 16:10</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-211-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-210-1.html</guid>
			<title>【转】EPOLL应用详解</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;从man手册中，得到ET和LT的具体描述如下&lt;br /&gt;
&lt;br /&gt;
EPOLL事件有两种模型：&lt;br /&gt;
Edge Triggered (ET)&lt;br /&gt;
Level Triggered (LT)&lt;br /&gt;
&lt;br /&gt;
假如有这样一个例子：&lt;br /&gt;
1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符&lt;br /&gt;
2. 这个时候从管道的另一端被写入了2KB的数据&lt;br /&gt;
3. 调用epoll_wait(2)，并且它会返回RFD，说明它已经准备好读取操作&lt;br /&gt;
4. 然后我们读取了1KB的数据&lt;br /&gt;
5. 调用epoll_wait(2)......&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这里说明了ET模式下 read 与 write 的封装问题&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-210-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nwh26YHRz5elo9aqNQKJ3FPOZu4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nwh26YHRz5elo9aqNQKJ3FPOZu4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nwh26YHRz5elo9aqNQKJ3FPOZu4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nwh26YHRz5elo9aqNQKJ3FPOZu4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/1Ljt5ph4NDo" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/1Ljt5ph4NDo/show-210-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-06-17 10:16</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-210-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-209-1.html</guid>
			<title>【转】epoll使用详解（精髓）</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;在linux的网络编程中，很长的时间都在使用select来做事件触发。在linux新的内核中，有了一种替换它的机制，就是epoll。&lt;br /&gt;
相比于select，epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中，它是采用轮询来处理的，轮询的fd数目越多，自然耗时越多。并且，在linux/posix_types.h头文件有这样的声明：&lt;br /&gt;
#define __FD_SETSIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; 1024&lt;br /&gt;
表示select最多同时监听1024个fd，当然，可以通过修改头文件再重编译内核来扩大这个数目，但这似乎并不治本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这篇文章述说了如何利用epoll的可写事件。&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-209-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yFItIyKI-B1ewEK_EyQplDkLJPs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yFItIyKI-B1ewEK_EyQplDkLJPs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yFItIyKI-B1ewEK_EyQplDkLJPs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yFItIyKI-B1ewEK_EyQplDkLJPs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/vEbnJp4GTW0" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/vEbnJp4GTW0/show-209-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-06-17 10:04</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-209-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-208-1.html</guid>
			<title>【转】Linux下面socket编程的非阻塞TCP研究（转载）</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;&lt;span&gt;&lt;strong&gt;tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="2"&gt;&lt;font color="#016600"&gt;&lt;font face="Courier New "&gt;在&lt;font color="#ff0000"&gt;阻塞模式&lt;/font&gt;下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大 小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将 数据收到接收缓存中,就会确认,并不一定要等待应用程序调用recv);&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span style="color: rgb(0,153,2)"&gt;&lt;span style="color: rgb(0,102,102)"&gt;在&lt;/span&gt;&lt;span style="color: rgb(255,1,2)"&gt;非阻塞模式&lt;/span&gt;&lt;span style="color: rgb(0,102,102)"&gt;下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,返回成功拷贝的大小;如缓存区可用空间为0,则返回-1,同时设置errno为EAGAIN.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;linux下可用&lt;span style="color: rgb(204,51,51)"&gt;sysctl -a | grep net.ipv4.tcp_wmem&lt;/span&gt;查看系统默认的发送缓存大小:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;net.ipv4.tcp_wmem = 4096 16384 81920&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;这 有三个值,第一个值是socket的发送缓存区分配的最少字节数,第二个值是默认值(该值会被net.core.wmem_default覆盖),缓存区 在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最大字节数(该值会被net.core.wmem_max覆盖).&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;根据实际测试,如果手工更改了net.ipv4.tcp_wmem的值,则会按更改的值来运行,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;应用程序应该根据应用的特性在程序中更改发送缓存大小:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩大1倍,设为20k.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font size="5"&gt;&lt;br /&gt;
-------------------实例分析----------------------&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;在 实际应用中,如果发送端是非阻塞发送,由于网络的阻塞或者接收端处理过慢,通常出现的情况是,发送应用程序看起来发送了10k的数据,但是只发送了2k到 对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应用程序能够收到的数据为2k.假如接收应用程序调用recv函数获 取了1k的数据在处理,在这个瞬间,发生了以下情况之一,双方表现为:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold"&gt;A. 发送应用程序认为send完了10k数据,关闭了socket:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;发 送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对 端.如果接收应用程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.), 然后得到一个对端socket被关闭的消息(recv返回0).这时,应该进行关闭.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold"&gt;B. 发送应用程序再次调用send发送8k的数据:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;假 如发送缓存的空间为20k,那么发送缓存可用空间为20-8=12k,大于请求发送的8k,所以send函数将数据做拷贝后,并立即返回8192;&lt;br /&gt;
&lt;br /&gt;
假如发 送缓存的空间为12k,那么此时发送缓存可用空间还有12-8=4k,send()会返回4096,应用程序发现返回的值小于请求发送的大小值后,可以认 为缓存区已满,这时必须阻塞(或通过select等待下一次socket可写的信号),如果应用程序不理会,立即再次调用send,那么会得到-1的值, 在linux下表现为errno=EAGAIN.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold"&gt;C. 接收应用程序在处理完1k数据后,关闭了socket:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;接 收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对方的ack).然后,发送应用程序会收到socket可读的信号(通常是 select调用返回socket可读),但在读取时会发现recv函数返回0,这时应该调用close函数来关闭socket(发送给对方ack);&lt;br /&gt;
&lt;br /&gt;
如 果发送应用程序没有处理这个可读的信号,而是在send,那么这要分两种情况来考虑,假如是在发送端收到RST标志之后调用send,send将返回-1,同时errno设为ECONNRESET表示对端网络已断开,&lt;/span&gt;&lt;font size="2"&gt;&lt;span&gt;&lt;span style="font-style: italic"&gt;但是,也有说法是进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程,如果忽略该信号,那么send是返回-1,errno为EPIPE(未证实)&lt;/span&gt;;&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;span&gt;如果是在发送端收到RST标志之前,则send像往常一样工作;&lt;br /&gt;
&lt;br /&gt;
以上说的是非阻塞的send情况,假如send是阻塞调用,并且正好处于阻塞时(例如一次性发送一个巨大的buf,超出了发送缓存),对端socket关闭,那么send将返回成功发送的字节数,如果再次调用send,那么会同上一样.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-weight: bold"&gt;D. 交换机或路由器的网络断开:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;接收应用程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为无数据可读的现象,这种情况需要应用程序来处理超时.一般做法是设定一个select等待的最大时间,如果超出这个时间依然没有数据可读,则认为socket已不可用.&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span&gt;发送应用程序会不断的将余下的数据发送到网络上,但始终得不到确认,所以缓存区的可用空间持续为0,这种情况也需要应用程序来处理.&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span&gt;如果不由应用程序来处理这种情况超时的情况,也可以通过tcp协议本身来处理,具体可以查看sysctl项中的:&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;net.ipv4.tcp_keepalive_intvl&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;net.ipv4.tcp_keepalive_probes&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;net.ipv4.tcp_keepalive_time&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;socklen_t&amp;nbsp;sendbuflen&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;socklen_t&amp;nbsp;len&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;sizeof&lt;/span&gt;&lt;span&gt;(sendbuflen); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;getsockopt(clientSocket,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_SNDBUF,&amp;nbsp;(&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;*)&amp;amp;sendbuflen,&amp;nbsp;&amp;amp;len); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;printf(&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;default,sendbuf:%d\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;sendbuflen); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;sendbuflen&amp;nbsp;=&amp;nbsp;10240; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;setsockopt(clientSocket,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_SNDBUF,&amp;nbsp;(&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;*)&amp;amp;sendbuflen,&amp;nbsp;len); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;getsockopt(clientSocket,&amp;nbsp;SOL_SOCKET,&amp;nbsp;SO_SNDBUF,&amp;nbsp;(&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;*)&amp;amp;sendbuflen,&amp;nbsp;&amp;amp;len); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;printf(&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;now,sendbuf:%d\n&amp;quot;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;sendbuflen); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CKo_zTGptOYup0jdc8vaD_-q9_I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CKo_zTGptOYup0jdc8vaD_-q9_I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CKo_zTGptOYup0jdc8vaD_-q9_I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CKo_zTGptOYup0jdc8vaD_-q9_I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/68LS6tA1oig" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/68LS6tA1oig/show-208-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-06-13 18:35</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-208-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-207-1.html</guid>
			<title>【转】send或者write socket遭遇SIGPIPE信号</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;当服务器close一个连接时，若client端接着发数据。根据TCP协议的规定，会收到一个RST响应，client再往这个服务器发送数据时，系统会发出一个SIGPIPE信号给进程，告诉进程这个连接已经断开了，不要再写了。&lt;/p&gt;
&lt;p&gt;又或者&lt;span style="color: rgb(153,1,2)"&gt;当一个进程向某个已经收到RST的socket执行写操作是，内核向该进程发送一个SIGPIPE信号。该信号的缺省学位是终止进程，因此进程必须捕获它以免不情愿的被终止。&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-207-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/X8MuE2YKWGUWj8QA_XErbzmn3Ok/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X8MuE2YKWGUWj8QA_XErbzmn3Ok/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/X8MuE2YKWGUWj8QA_XErbzmn3Ok/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X8MuE2YKWGUWj8QA_XErbzmn3Ok/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/ADDV1S9EZcY" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/ADDV1S9EZcY/show-207-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-06-13 07:43</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-207-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-206-1.html</guid>
			<title>Linux下调试程序相关的内容</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;1.开启core文件&lt;/p&gt;
&lt;p&gt;现在的大部分linux默认不产生core文件。&lt;wbr&gt;&lt;/wbr&gt;如何设置产生core文件配合调试。&lt;br /&gt;
调试的时候有时候不知道问题发生在哪里，&lt;wbr&gt;&lt;/wbr&gt;这是侯就需要产生core文件，&lt;wbr&gt;&lt;/wbr&gt;core文件是程序崩溃时候的内存镜像的转储文件，&lt;br /&gt;
里面保存了文件运行时候内存中的一些数据，为调试提供信息。&lt;br /&gt;
在bash 中 这样设置，ulimit -c size &lt;br /&gt;
其中size是产生的core文件的大小，&lt;wbr&gt;&lt;/wbr&gt;根据你的应用程序可以适当设置，如果保存的信息不全的话，&lt;wbr&gt;&lt;/wbr&gt;可以考虑适当&lt;br /&gt;
改变这个值，让core保存更多的信息。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/40kXLQ_-_Y8jIxndAyFJaNR1ws0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/40kXLQ_-_Y8jIxndAyFJaNR1ws0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/40kXLQ_-_Y8jIxndAyFJaNR1ws0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/40kXLQ_-_Y8jIxndAyFJaNR1ws0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/qxTJMOUuiO4" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/qxTJMOUuiO4/show-206-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-06-13 06:45</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-206-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-205-1.html</guid>
			<title>［转］安装mysql 获得 mysql.h 建立C接口</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;&lt;br /&gt;
代码: &lt;br /&gt;
sudo apt-get install mysql-server mysql-client &lt;br /&gt;
&lt;br /&gt;
再装开发包 &lt;br /&gt;
代码: &lt;br /&gt;
sudo apt-get install libmysqlclient15-dev &lt;br /&gt;
&lt;br /&gt;
安装完以后，C代码里添加头文件 &lt;br /&gt;
代码: &lt;br /&gt;
#include &amp;lt;mysql.h&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-205-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nauCq2Yv8f1CFK1gjhoMyHBFdpE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nauCq2Yv8f1CFK1gjhoMyHBFdpE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nauCq2Yv8f1CFK1gjhoMyHBFdpE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nauCq2Yv8f1CFK1gjhoMyHBFdpE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/2i650u2Ld34" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/2i650u2Ld34/show-205-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-06-09 10:31</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-205-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-204-1.html</guid>
			<title>pthread_cond_wait() 函数</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心，也是最难以理解的部分。&lt;/p&gt;
&lt;p&gt;首先，让我们考虑以下情况：线程为查看已链接列表而锁定了互斥对象，然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点，但是现在却没有节点。因此，它只能：&lt;/p&gt;
&lt;p&gt;锁定互斥对象时，线程将调用 pthread_cond_wait(&amp;amp;mycond,&amp;amp;mymutex)。pthread_cond_wait() 调用相当复杂，因此我们每次只执行它的一个操作。&lt;/p&gt;
&lt;p&gt;pthread_cond_wait() 所做的第一件事就是同时对互斥对象解锁（于是其它线程可以修改已链接列表），并等待条件 mycond 发生（这样当 pthread_cond_wait() 接收到另一个线程的&amp;ldquo;信号&amp;rdquo;时，它将苏醒）。现在互斥对象已被解锁，其它线程可以访问和修改已链接列表，可能还会添加项。 【要求解锁并阻塞是一个原子操作】&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-204-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UnNcT_az1qLKXP1XaRz238T9_kI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UnNcT_az1qLKXP1XaRz238T9_kI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UnNcT_az1qLKXP1XaRz238T9_kI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UnNcT_az1qLKXP1XaRz238T9_kI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/jQcQhfsJyVU" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/jQcQhfsJyVU/show-204-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-06-03 18:08</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-204-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-203-1.html</guid>
			<title>code::blocks + wxWidgets 2.8 在ubuntu 9.04下的安装</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;code::blocks + wxWidgets 2.8 在ubuntu 9.04下的安装。安装步骤：&lt;br /&gt;
&lt;br /&gt;
1、安装必要组件&lt;br /&gt;
代码:&lt;br /&gt;
sudo apt-get install build-essential&lt;br /&gt;
代码:&lt;br /&gt;
sudo apt-get install gdb&lt;br /&gt;
&lt;br /&gt;
2、安装wxWidgets必要的库文件&lt;br /&gt;
sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers  wx-common&lt;br /&gt;
&lt;br /&gt;
3、设置 wxWidgets 默认版本&lt;br /&gt;
代码:&lt;br /&gt;
sudo update-alternatives --config wx-config&lt;br /&gt;
&lt;br /&gt;
4、之后安装code::blocks即可。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
暂时这么多，主要是ubuntu的源里面什么都有了。直接打开Code::Blocks建立wxWidgets的工程，编译运行。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Eo874qd0pDMejfeEbhq5Z-h2nHg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eo874qd0pDMejfeEbhq5Z-h2nHg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Eo874qd0pDMejfeEbhq5Z-h2nHg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Eo874qd0pDMejfeEbhq5Z-h2nHg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/Oof9jZREIO8" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/Oof9jZREIO8/show-203-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-05-19 11:15</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-203-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-202-1.html</guid>
			<title>【转】Online-game服务器端设计(4)</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;　　在这一章节，我想谈谈关于服务器端的脚本的相关设计。因为在上一章节里面，谈NPC智能相关的时候已经接触到一些脚本相关的东东了。还是先来谈谈脚本的作用吧。&lt;br /&gt;
　　在基于编译的服务器端程序中，是无法在程序的运行过程中构建一些东西的，那么这个时候就需要脚本语言的支持了，由于脚本语言涉及到逻辑判断，所以光提供一些函数接口是没用的，还需要提供一些简单的语法和文法解析的功能。其实说到底，任何的事件都可以看成两个部分：第一是对自身，或者别的物件的数值的改变，另外一个就是将该事件以文字或者图形的方式广播出去。那么，这里牵扯到一个很重要的话题，就是对某一物件进行寻址。恩，谈到这，我想将本章节分为三个部分来谈，首先是服务器如何来管理动态创建出来的物件（服务器内存管理），第二是如何对某一物件进行寻址，第三则是脚本语言的组织和解释。其实之所以到第四章再来谈服务器的内存管理是因为在前几章谈这个的话，大家对其没有一个感性的认识，可能不知道服务器的内存管理究竟有什么用。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-202-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1JJ_Y4vPSTiaaWNtqsebbylZXiE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1JJ_Y4vPSTiaaWNtqsebbylZXiE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1JJ_Y4vPSTiaaWNtqsebbylZXiE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1JJ_Y4vPSTiaaWNtqsebbylZXiE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/npGW2u2148I" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/npGW2u2148I/show-202-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-05-13 11:55</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-202-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-201-1.html</guid>
			<title>【转】Online-game服务器端设计（3）</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;　　下面我想来谈谈关于服务器上NPC的设计以及NPC智能等一些方面涉及到的问题。首先，我们需要知道什么是NPC，NPC需要做什么。NPC的全称是（Non-Player Character），很显然，他是一个character，但不是玩家，那么从这点上可以知道，NPC的某些行为是和玩家类似的，他可以行走，可以战斗，可以呼吸（这点将在后面的NPC智能里面提到），另外一点和玩家物件不同的是，NPC可以复生（即NPC被打死以后在一定时间内可以重新出来）。其实还有最重要的一点，就是玩家物件的所有决策都是玩家做出来的，而NPC的决策则是由计算机做出来的，所以在对NPC做何种决策的时候，需要所谓的NPC智能来进行决策。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-201-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aZtZvufj5GrscIcPo0piINfyYcw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aZtZvufj5GrscIcPo0piINfyYcw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aZtZvufj5GrscIcPo0piINfyYcw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aZtZvufj5GrscIcPo0piINfyYcw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/FedzKjemySk" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/FedzKjemySk/show-201-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-05-13 11:54</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-201-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-200-1.html</guid>
			<title>【转】Online-game服务器端设计(1、2)</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;　　谈这个话题之前，首先要让大家知道，什么是服务器。在网络游戏中，服务器所扮演的角色是同步，广播和服务器主动的一些行为，比如说天气，NPC AI之类的，之所以现在的很多网络游戏服务器都需要负担一些游戏逻辑上的运算是因为为了防止客户端的作弊行为。了解到这一点，那么本系列的文章将分为两部分来谈谈网络游戏服务器的设计，一部分是讲如何做好服务器的网络连接，同步，广播以及NPC的设置，另一部分则将着重谈谈哪些逻辑放在服务器比较合适，并且用什么样的结构来安排这些逻辑。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-200-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mKN7CeTebyb4Da6jjz2eJCtHSwk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mKN7CeTebyb4Da6jjz2eJCtHSwk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mKN7CeTebyb4Da6jjz2eJCtHSwk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mKN7CeTebyb4Da6jjz2eJCtHSwk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/R0-2tbKEvo0" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/R0-2tbKEvo0/show-200-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-05-13 11:35</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-200-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-199-1.html</guid>
			<title>【转】C/C++的思索 C++之父访谈录</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;作者：佚名 &lt;br /&gt;
翻译整理：pigprince &lt;br /&gt;
---------------------------------------------------------------------- &lt;br /&gt;
在1998年的元旦，Bjarne Stroustrup（C++之父）接受了IEEE《计算机》杂志记者的专 &lt;br /&gt;
访。编辑很自然的认为他会对于过去七年来使用他创建的语言进行面对对象设计做一个 &lt;br /&gt;
历史性的回顾。而在这个专访中，记者获得了更有价值的新闻，但是最后编辑决定为了 &lt;br /&gt;
整个IT产业，这个稿子不能发表，但是就像其它被砍掉的新闻，往往还是弄得路人皆知 &lt;br /&gt;
的。 &lt;br /&gt;
这一篇适当时专访的完全拷贝，没有被编辑、删改或者做过什么润色处理，也没有发布 &lt;br /&gt;
过，可能看起来不像常见的杂志文章，但这是实情。 &lt;br /&gt;
你会发现真正引人入胜的地方... ...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.joy999.com//show-199-1.html" target="_blank"&gt;阅读全文&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/r_mnX202SyIWJC66-5V-Bo_OtJE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r_mnX202SyIWJC66-5V-Bo_OtJE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/r_mnX202SyIWJC66-5V-Bo_OtJE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/r_mnX202SyIWJC66-5V-Bo_OtJE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/1TTS6aHVYCU" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/1TTS6aHVYCU/show-199-1.html</link>
			<category domain="http://blog.joy999.com//category-21-1.html">C/C++</category>
			<pubDate>2010-05-13 09:49</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-199-1.html</feedburner:origLink></item>
		<item>
			<guid isPermaLink="false">http://blog.joy999.com//show-198-1.html</guid>
			<title>【转】c调用c++和c++调用c时所使用的extern "c"的区别</title>
			<author>有空来玩玩</author>
			<description>&lt;p&gt;使用extern &amp;quot;C&amp;quot; 主要是因为C编译器编译函数时不带参数的类型信息，只包含函数的符号名字。如 &lt;br /&gt;
int foo( float x )&lt;br /&gt;
C编译器会将此函数编译成类似_foo的符号，C连接器只要找到了调用函数的符号，就认为连接成功。&lt;br /&gt;
而C++编译器为了实现函数重载，会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于_foo_float这样的符号。&lt;br /&gt;
所以，C调用C++，使用extern &amp;quot;C&amp;quot;则是告诉编译器依照C的方式来编译封装接口，当然接口函数里面的C++语法还是按C++方式编译。&lt;br /&gt;
如：&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C++&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;extern&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="comment"&gt;//... &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
这样,编译器会将foo函数编译成类似_foo符号，而不会编译成类似_foo_int符号&lt;br /&gt;
则C可以这样调用C++函数&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;cc(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo(&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="comment"&gt;//... &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;如果想调用重载的C++函数，则须封装单独的接口共C调用。&lt;br /&gt;
如&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C++&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;extern&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo_i(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo(&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;extern&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo_f(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo(&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;则C中可这样调用&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo_i(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo_f(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;ccc(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x1,&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x2&amp;nbsp;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo_i(&amp;nbsp;x1&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo_f(&amp;nbsp;x2&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="comment"&gt;//&amp;nbsp;... &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li class="alt"&gt;&lt;span&gt;}&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
而C++调用C，extern &amp;quot;C&amp;quot; 的作用是：让C++连接器找调用函数的符号时采用C的方式 如：&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
C++这样调用C函数&lt;/p&gt;
&lt;div class="codeText"&gt;
&lt;div class="codeHead"&gt;C++代码&lt;/div&gt;
&lt;ol class="dp-cpp"&gt;
    &lt;li class="alt"&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;C++&amp;nbsp;Code &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="keyword"&gt;extern&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;foo(&amp;nbsp;&lt;/span&gt;&lt;span class="datatypes"&gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;x&amp;nbsp;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
就是让C++连接器能过类似于_foo来查找此函数，而非类似于_foo_int这样的符号。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mQT9-tJATsYSqUTk9wproC2YOsM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQT9-tJATsYSqUTk9wproC2YOsM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mQT9-tJATsYSqUTk9wproC2YOsM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mQT9-tJATsYSqUTk9wproC2YOsM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/joy999/blog/~4/VK14ZIVpexU" height="1" width="1"/&gt;</description>
			<link>http://feedproxy.google.com/~r/joy999/blog/~3/VK14ZIVpexU/show-198-1.html</link>
			<category domain="http://blog.joy999.com//category-20-1.html">Linux编程</category>
			<pubDate>2010-05-11 11:41</pubDate>
		<feedburner:origLink>http://blog.joy999.com//show-198-1.html</feedburner:origLink></item>
	</channel>
</rss>
