<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>博望坡</title>
  <link>http://morningsun.blogbus.com</link>
  <description><![CDATA[]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Thu, 01 Jan 1970 07:00:00 +0700</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/8/6/8/3868/avatar_3868_96.jpg</url>
									<title>博望坡</title>
									<link>http://morningsun.blogbus.com</link>
								</image>  <item>
   <title>cat功能</title>
   <description><![CDATA[<p><table border="0" cellspacing="0" cellpadding="0" width="572" class="data-table-2" summary="Options for control of output in AIX cat"><tbody><tr><th>选项</th><th>描述</th></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -b</font></code></td><td>不对空白行编号。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -e</font></code></td><td>使用 <code><font face="Courier New">$</font></code> 字符显示行尾。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -n</font></code></td><td>从 1 开始对所有输出行编号。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -q</font></code></td><td>使用静默操作（禁止错误消息）。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -r</font></code></td><td>将所有多个空行替换为单行（&ldquo;压缩&rdquo;空白）。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -S</font></code></td><td>将多个空白行压缩到单行中（与 <code><font face="Courier New">-r</font></code> 相同）。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -s</font></code></td><td>禁止错误消息（静默操作）。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -t</font></code></td><td>将制表符显示为 <code><font face="Courier New">^I</font></code>。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -u</font></code></td><td>不对输出进行缓冲。</td></tr><tr><td class="tb-row"><code><font face="Courier New">&nbsp; -v</font></code></td><td>可视地显示非打印控制字符。</td></tr></tbody></table></p><p>例：</p><p>1。在文件末位追加：cat &gt;&gt; file , 输入文字，以ctrol-D结束</p><p>2。在文件前追加：cat -file &gt;&gt; newfile，输入文字，以ctrol-D结束</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/7338802.html">Linux 下创建基于Image的小分区</a> 2007-08-03</div><div><a href="http://morningsun.blogbus.com/logs/7302595.html">ORACLE 10g RAC failover and load balance configuration</a> 2007-08-02</div><div><a href="http://morningsun.blogbus.com/logs/6584745.html">Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0)</a> 2007-07-10</div><div><a href="http://morningsun.blogbus.com/logs/6277999.html">初试Google Map APIs</a> 2007-07-02</div><div><a href="http://morningsun.blogbus.com/logs/6189203.html">MingGw and FileZilla compile</a> 2007-06-28</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F11537559.html&title=cat%E5%8A%9F%E8%83%BD">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/11537559.html</link>
   <author>morningSun</author>
   <pubDate>Wed, 05 Dec 2007 14:34:56 +0800</pubDate>
  </item>
  <item>
   <title>Signal 数据结构解析</title>
   <description><![CDATA[<p><font style="background-color: #ffffff" color="#000000">1.&nbsp;sigaction结构体&nbsp; </font></p><p><font style="background-color: #ffffff" color="#000000">struct sigaction {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __sighandler_t _sa_handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void (*_sa_sigaction)(int,struct siginfo_t *, void *)；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }_u<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigset_t sa_mask；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long sa_flags； <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void (*sa_restorer)(void)； </font></p><p><font style="background-color: #ffffff" color="#000000">} </font></p><p><font style="background-color: #ffffff" color="#000000">union中的第一个__sighandler_t代表单参数信号处理函数，参数为信号值，还可以为系统提供的值如： </font></p><p><font style="background-color: #ffffff" color="#000000">#define SIG_ERR ((__sighandler_t) -1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Error return.&nbsp; */<br />#define SIG_DFL ((__sighandler_t) 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Default action.&nbsp; */<br />#define SIG_IGN ((__sighandler_t) 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Ignore signal.&nbsp; */<br />union中的第二个函数指针，使用户可以自己定义三参数信号处理函数，其中第二个参数类型siginfo_t，定义如下： </font></p><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">2. 对于real-time signal，结构定义如下：</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">typedef struct {	int si_signo;  /* 信号值，对所有信号有意义*/	</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">int si_errno;  /* errno值，对所有信号有意义*/	</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">int si_code;   /* 信号产生的原因，对所有信号有意义*/	</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0"><font size="+0">union sigval si_value; /*对real-time signal 有意义 */</font>	</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">} <span style="color: black; background-color: cyan"><font size="+0">siginfo_t</font></span>;第四个union定义如下：</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">3.union sigval {int sival_int;void *sival_ptr;}</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">该结构指明value要么是一个整形的值，或者是一个指针，这就使得编程者可以通过传递指针来传递一个</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">复杂的对象或结构。</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">* 信号函数之间的参数传递情况如下：</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">sigqueue 函数的第三参数，参数sigval将传递（拷贝）到sigaction函数的第二参数</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">sigaction结构体中的_sa_sigaction</font>
</font></font></font></font></font></pre><pre class="displaycode"><font size="+0"><font size="+0"><font size="+0"><font color="#000000"><font style="background-color: #ffffff"><font size="+0">指向函数的<span style="color: black; background-color: cyan"><font size="+0">siginfo_t中的si_value值。(拗口！)</font></span></font>
</font></font></font></font></font></pre><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/7338802.html">Linux 下创建基于Image的小分区</a> 2007-08-03</div><div><a href="/logs/6584745.html">Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0)</a> 2007-07-10</div><div><a href="/logs/6364968.html">linux kernel 体系结构</a> 2007-07-04</div><div><a href="/logs/3892759.html">安装win32和Linux双系统的boot loader设置</a> 2006-11-23</div><div><a href="/logs/3851671.html">一个简单makefile</a> 2006-11-17</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F7732682.html&title=Signal+%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%A7%A3%E6%9E%90">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/7732682.html</link>
   <author>morningSun</author>
   <pubDate>Thu, 16 Aug 2007 10:10:36 +0800</pubDate>
  </item>
  <item>
   <title>Real-time Signal 学习</title>
   <description><![CDATA[<p>
Real-time signal 是linux 2.3内核后引入的新的feature。类似于win32的Completion Port, Realtime signal 机制可用于反应器，适用于server的高速IO模型。
</p>
<p>
Real-time signal 的原理是，将文件描述符通过fnctl 设置为nonblock，类似这样：
</p>
<p>
&nbsp;nflags |= O_RDWR | O_NONBLOCK | O_ASYNC;<br />
&nbsp;nFcntl = ::fcntl(aFd, F_SETFL, nflags);
</p>
<p>
&nbsp;再将该句柄与具体的real-time signal 绑定，
</p>
<p>
nFcntl = ::fcntl(aFd, F_SETSIG, RTSIG_X)
</p>
<p>
最后设置这个描述符将该信号报往的进程Pid
</p>
<p>
nFcntl = ::fcntl(aFd, F_SETOWN, Pid);
</p>
<p>
这些工作做完之后，当该文件描述符发生io操作时将上报给进程real-time signal RTSIG-X
</p>
<p>
而reactor可以run一个工作线程，并设置感兴趣的信号集sigset为阻塞状态
</p>
<p>
nRet = ::sigprocmask(SIG_BLOCK, &amp;sigset, NULL);
</p>
<p>
linux proc/ 文件系统中的设置rt signal 最大值的文件是/proc/sys/kernel/rtsig-max，可以通
</p>
<p>
_sysctl命令进行调解。节点名为{ CTL_KERN, KERN_RTSIGMAX }
</p>
<p>
OK， 一切做完之后，我们只要将工作线程run起来后，做等待信号操作
</p>
<p>
sigRet = ::sigwaitinfo(&amp;sigset, &amp;siginfo);
</p>
<p>
返回后并检查siginfo.si_band的值，如果是POLLERR|POLLHUP|POLLNVAL 为error值，
</p>
<p>
否则处理该句柄，进行相应的读写操作。
</p>
<p>
while(!shutDown())<br />
{<br />
&nbsp;&nbsp;&nbsp; int sigret = sigwaitinfo(&amp;sigset, &amp;siginfo);<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; handleEvent(sigret,...)<br />
}
</p>
<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/7338802.html">Linux 下创建基于Image的小分区</a> 2007-08-03</div><div><a href="/logs/6364968.html">linux kernel 体系结构</a> 2007-07-04</div><div><a href="/logs/4774249.html">Using Vtune 8.02 in Linux</a> 2007-03-15</div><div><a href="/logs/3896815.html">i386, i686的区别</a> 2006-11-24</div><div><a href="/logs/3892759.html">安装win32和Linux双系统的boot loader设置</a> 2006-11-23</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F7731943.html&title=Real-time+Signal+%E5%AD%A6%E4%B9%A0">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/7731943.html</link>
   <author>morningSun</author>
   <pubDate>Thu, 16 Aug 2007 09:44:34 +0800</pubDate>
  </item>
  <item>
   <title>Linux 下创建基于Image的小分区</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 有需求要检查应用程序当磁盘满时的内存激增现象，写满物理硬盘不仅困难且自身的额外操作也将受到限制，采用linux下自带命令可创建一个ext2的Image，将此Image mount进系统，就可完成一个新分区的创建。过程如下</p><p>1. dd if=/dev/hda1 of=image.iso bs=2048 count=1024 // 创建一个block size为2048bytes，1024个block的空文件image.iso</p><p>2. losetup /dev/loop0 image.iso // 因image.iso不是块设备，不能进行文件系统创建，需要将其和一个块设备联系起来</p><p>3. mkfs -t ext2 /dev/loop0 // 创建ext2文件系统</p><p>4. mount -t ext2 /dev/loop0 /mnt //将设备mount到/mnt目录中</p><p>...............................// 进行对mnt的操作，拷贝文件等</p><p>5. umount /mnt </p><p>6. losetup -d /dev/loop0 // 解除联系</p><p>此后就可以用mount -t ext2 -o loop image.iso /mnt/ 来直接mount该分区了</p><p>&nbsp;</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/11537559.html">cat功能</a> 2007-12-05</div><div><a href="http://morningsun.blogbus.com/logs/7302595.html">ORACLE 10g RAC failover and load balance configuration</a> 2007-08-02</div><div><a href="http://morningsun.blogbus.com/logs/6584745.html">Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0)</a> 2007-07-10</div><div><a href="http://morningsun.blogbus.com/logs/6277999.html">初试Google Map APIs</a> 2007-07-02</div><div><a href="http://morningsun.blogbus.com/logs/6189203.html">MingGw and FileZilla compile</a> 2007-06-28</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F7338802.html&title=Linux+%E4%B8%8B%E5%88%9B%E5%BB%BA%E5%9F%BA%E4%BA%8EImage%E7%9A%84%E5%B0%8F%E5%88%86%E5%8C%BA">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/7338802.html</link>
   <author>morningSun</author>
   <pubDate>Fri, 03 Aug 2007 09:41:39 +0800</pubDate>
  </item>
  <item>
   <title>ORACLE 10g RAC failover and load balance configuration</title>
   <description><![CDATA[<p>&nbsp;Oracle 10g rac 始支持两个instance的failover和loadbalance。示例如下：</p><p>VMRACTEST.HF.COM=<br />&nbsp;&nbsp;&nbsp; (DESCRIPTION =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.209.47) (PORT = 1521))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.209.49) (PORT = 1521))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (LOAD_BALANCE = yes)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVER = DEDICATED)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = vmractest.hf.com)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (FAILOVER_MODE = <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (TYPE = SELECT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(METHOD = BASIC)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RETRIES = 180)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DELAY = 5))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp;&nbsp;&nbsp; )</p><p>&nbsp;如上配置，若使用oci client连接RAC则client将连接到172.16.209.47 或 172.16.209.49的任意一台实例上，假设我们连到了49上。TCP Connection状态为ESTABLISHED。当49的instance发生故障，该client端TCP连接状态变为Close_WAIT，不要以为连接已断。当我们执行数据库操作时，oci将重连到47的TCP Connection</p><p>&nbsp;</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/11537559.html">cat功能</a> 2007-12-05</div><div><a href="http://morningsun.blogbus.com/logs/7338802.html">Linux 下创建基于Image的小分区</a> 2007-08-03</div><div><a href="http://morningsun.blogbus.com/logs/6584745.html">Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0)</a> 2007-07-10</div><div><a href="http://morningsun.blogbus.com/logs/6277999.html">初试Google Map APIs</a> 2007-07-02</div><div><a href="http://morningsun.blogbus.com/logs/6189203.html">MingGw and FileZilla compile</a> 2007-06-28</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F7302595.html&title=ORACLE+10g+RAC+failover+and+load+balance+configuration">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/7302595.html</link>
   <author>morningSun</author>
   <pubDate>Thu, 02 Aug 2007 14:20:58 +0800</pubDate>
  </item>
  <item>
   <title>根据域名获取IP地址的可重入版本gethostbyname_r</title>
   <description><![CDATA[<p>gethostbyname_r支持多线程情况下的可重入访问。示例代码如下：</p><p>&nbsp;&nbsp;&nbsp; int herrno=0;<br />&nbsp;&nbsp;&nbsp; struct hostent hostbuf;<br />&nbsp;&nbsp;&nbsp; struct hostent* result;<br />&nbsp;&nbsp;&nbsp; char buffer[8192];<br />&nbsp;&nbsp;&nbsp; gethostbyname_r( argv[1], &amp;hostbuf, buffer, sizeof(buffer),&nbsp; &amp;result, &amp;herrno );<br />&nbsp;&nbsp;&nbsp; char str[256];&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; for (char** pptr = result-&gt;h_addr_list; *pptr != 0; pptr++)&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inet_ntop(result-&gt;h_addrtype, (u_int32_t*)(*pptr), str, sizeof(str));&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; str &lt;&lt; std::endl;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; return 0;</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/6616233.html">TCP 粘包及分段研究</a> 2007-07-11</div><div><a href="http://morningsun.blogbus.com/logs/6893593.html">TCP window size (zz)</a> 2007-07-10</div><div><a href="http://morningsun.blogbus.com/logs/395163.html">VoWLAN &amp;&amp; IPv6 Security</a> 2004-09-18</div><div><a href="http://morningsun.blogbus.com/logs/374932.html">2.5G和WLAN的融合</a> 2004-09-06</div><div><a href="http://morningsun.blogbus.com/logs/215182.html">SMIPv6 Overview</a> 2004-06-10</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F6796938.html&title=%E6%A0%B9%E6%8D%AE%E5%9F%9F%E5%90%8D%E8%8E%B7%E5%8F%96IP%E5%9C%B0%E5%9D%80%E7%9A%84%E5%8F%AF%E9%87%8D%E5%85%A5%E7%89%88%E6%9C%ACgethostbyname_r">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/6796938.html</link>
   <author>morningSun</author>
   <pubDate>Tue, 17 Jul 2007 15:21:38 +0800</pubDate>
  </item>
  <item>
   <title>一种迫使子类实现相关方法的技巧</title>
   <description><![CDATA[<p>子类所需的公共操作常常被上提到父类中实现，父类的方法往往会回调子类方法实现多态。这就要求在子类中提供该方法的不同实现。根据不同的需求，父类中可以提供该方法的默认操作，也可以不提供。这就对类结构的设计提供了不同的要求。</p><p>父类中方法不可以被访问，而且不提供默认实现的方法如下，可以迫使子类实现相关方法，另外父类的方法对外不可见：</p><p>&nbsp; 4 class base<br />&nbsp; 5 {<br />&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp; public:<br />&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp; void wrapGet() {get();}<br />&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp; private:<br />&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp; virtual void get() = 0;<br />&nbsp;11 <br />&nbsp;12 };<br />&nbsp;13&nbsp;&nbsp;<br />&nbsp;15 class drived: public base<br />&nbsp;16 {<br />&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp; public:<br />&nbsp;18&nbsp;&nbsp;&nbsp;&nbsp; void get(){std::cout &lt;&lt; &quot;This is dri class&quot; &lt;&lt; std::endl;}<br />&nbsp;19 };</p><p>&nbsp;</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/6361862.html">Boost Unit test framework</a> 2007-07-04</div><div><a href="http://morningsun.blogbus.com/logs/4086511.html">Point Traits -- 用以在编译期确定是否指针型别</a> 2006-12-19</div><div><a href="http://morningsun.blogbus.com/logs/3973238.html">B.S 举的一个结合Generic和OO两种设计思维的经典例子（CC）</a> 2006-12-05</div><div><a href="http://morningsun.blogbus.com/logs/3968408.html">使用dtor避免内存泄露</a> 2006-12-04</div><div><a href="http://morningsun.blogbus.com/logs/3919377.html">封装stringstream的优雅函数，摘自Boost</a> 2006-11-27</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F6659730.html&title=%E4%B8%80%E7%A7%8D%E8%BF%AB%E4%BD%BF%E5%AD%90%E7%B1%BB%E5%AE%9E%E7%8E%B0%E7%9B%B8%E5%85%B3%E6%96%B9%E6%B3%95%E7%9A%84%E6%8A%80%E5%B7%A7">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/6659730.html</link>
   <author>morningSun</author>
   <pubDate>Fri, 13 Jul 2007 10:46:29 +0800</pubDate>
  </item>
  <item>
   <title>TCP 粘包及分段研究</title>
   <description><![CDATA[<p>这两天碰到一个TCP read buffer 满，而发送Zero window message 给Server， Server 在收到多次这样的message后断开该缓慢连接的问题。想到了几个问题，查证后特记录如下：</p><p>1. TCP Zero Window message 与 RST ACK：Zero Window message 通常在本地recieve buffer 满时发出，向server通知&quot;已经不能再向我发数据了，已经处理不过来了&quot;，server收到这样的notify则会暂停向该client发数据。长此以往，有些防火墙的规则会发RST message将这些慢连接干掉。</p><p>2. TCP MSS 与 MTU 分段：MSS叫Maxitum Segment Size ，通常的实现就是按照MTU来的，因此MSS一般来说大小为1500-20-20=1460。如果应用层数据太大，大于一个MSS，则TCP将作分段处理。MTU基于物理层而言，ethnet的MTU为1500，PPPoe为1492，上层的message大小如果大于MTU，则将在IP层被分片。有的TCP报文为保证顺序要求，设置了Dont fragment 位，指示IP层不要分片，如果这段网络上的MTU &lt; MSS + headers 的大小,则将丢弃该报文。</p><p>3. 阻塞和非阻塞套接字，阻塞套接字会将所有的data拷贝到发送缓冲区后才返回，也就是如果窗口为16K，要发送32k的数据返回时，至少有16K的数据已经到达对端，还有部分数据在本地缓冲区内。如果为非阻塞模式，发送32K数据将马上返回，返回的nbyte小于32K，需要通过循环将所有数据发完。</p><p>&nbsp;</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/6796938.html">根据域名获取IP地址的可重入版本gethostbyname_r</a> 2007-07-17</div><div><a href="http://morningsun.blogbus.com/logs/6893593.html">TCP window size (zz)</a> 2007-07-10</div><div><a href="http://morningsun.blogbus.com/logs/395163.html">VoWLAN &amp;&amp; IPv6 Security</a> 2004-09-18</div><div><a href="http://morningsun.blogbus.com/logs/374932.html">2.5G和WLAN的融合</a> 2004-09-06</div><div><a href="http://morningsun.blogbus.com/logs/215182.html">SMIPv6 Overview</a> 2004-06-10</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F6616233.html&title=TCP+%E7%B2%98%E5%8C%85%E5%8F%8A%E5%88%86%E6%AE%B5%E7%A0%94%E7%A9%B6">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/6616233.html</link>
   <author>morningSun</author>
   <pubDate>Wed, 11 Jul 2007 15:37:03 +0800</pubDate>
  </item>
  <item>
   <title>TCP window size (zz)</title>
   <description><![CDATA[How many of you have notice that no matter you have a 100 Mb line you<br />only get near 2 Mbps, well that is<br />because the TCP window size is only of 32 kB or 64 kB on Linux (depends<br />on distribution) and 8 kB on M$ Windows.<br /><br />The TCP window size is the amount of data that will be send on a<br />connection before a host stops and waits<br />for an acknowledgment. This is used by TCP to prevent congestion.<br />Ideally it should be:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window size = Bandwidth x round trip time<br /><br /><br />@@WARNING@@<br />*&nbsp;&nbsp;&nbsp; If your window size is too small, you won&#39;t use the network to it&#39;s<br />full capacity<br />*&nbsp;&nbsp;&nbsp; If your window size is too big, you risk overloading the network<br />and creating congestion and packet loss<br />*&nbsp;&nbsp;&nbsp; On a WAN, setting the TCP window size correctly plays a big part in<br />getting good performance<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (it can easily double performance or more)<br /><br /><br />The peak bandwidth of the link is typically expressed in Mbit/s. The<br />round-trip delay for a link can be measured with traceroute, and for<br />high-speed WAN<br />links is typically between 10 msec and 100 msec. For a 60 msec, 120 Mbps<br />path, the bandwidth*delay product would be 7200 kbit, or 900 kByte (kB).<br /><br />...so here is how to change the<br />TCP Window size on Linux in order to achieve higher bandwidth.<br /><br />#cd /proc/sys/net/core<br />#ls<br />message_burst&nbsp;&nbsp;&nbsp; netdev_max_backlog&nbsp;&nbsp;&nbsp; rmem_default&nbsp;&nbsp;&nbsp; wmem_default<br />message_cost&nbsp;&nbsp;&nbsp; optmem_max&nbsp;&nbsp;&nbsp; rmem_max&nbsp;&nbsp;&nbsp; wmem_max<br />-------<br />(The secret are on these files)<br />/proc/sys/net/core/rmem_default&nbsp;&nbsp; - default receive window<br />/proc/sys/net/core/rmem_max&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - maximum receive window<br />/proc/sys/net/core/wmem_default&nbsp; - default send window<br />/proc/sys/net/core/wmem_max&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - maximum send window<br />--------<br /># cat&nbsp;&nbsp;&nbsp; wmem_default&nbsp;&nbsp;&nbsp; wmem_max&nbsp;&nbsp;&nbsp; rmem_default&nbsp;&nbsp;&nbsp; rmem_max<br />65535<br />65535<br />65535<br />65535<br />#<br />(If you change these numbers you are changing the TCP window)<br /><br />The theorical values are 65535 on all of them because asume bandwidth of<br />100<br />Mbits/s and the round trip time was 5 msec, the TCP window should be<br /><br />(100x10^6) bytes/sec *&nbsp; (5x10^-3) sec = 65000 bytes or 65 kilobytes<br /><br />or<br /><br />500x10^3 bits (65 kilobytes)<br /><br /><br />But imagine right now we (the UPR) have a DS3 (45Mbit/sec) with Sprint<br />and the average<br />round trip is 115 ms (do ping to anywhere outside and you will get<br />higher numbers)<br /><br />So the computation will be:<br /><br />45 Mbit/sec * 115 ms<br />&nbsp;&nbsp;&nbsp; = 45e6 * 115e-3<br />&nbsp;&nbsp;&nbsp; = 5,175,000 bits / 8 / 1024<br />&nbsp;&nbsp;&nbsp; = 631 KBytes<br /><br />That means that our ideal TCP Window is 631 KBytes.<br /># cat 646875 &gt; /proc/sys/net/core/wmem_max<br /># cat 646875 &gt; /proc/sys/net/core/wmem_default<br /># cat 646875 &gt; /proc/sys/net/core/rmem_max<br /># cat 646875 &gt; /proc/sys/net/core/rmem_default<br /><br /><br />Well, hope this works for you. Note that this is not using the Internet2<br />link yet. Probably will<br />require a much smaller TCP Window. Please let me know if you find any<br />difference on performance.<br /><br />DISCLAIMER: These are teorical numbers and are not guaranty to work for<br />everyone in the same way.<br /><br /><br />For M$ Windows 9x&nbsp; users please refer to:<br />&nbsp;&nbsp;&nbsp; <a href="http://moat.nlanr.net/Software/TCPtune/">http://moat.nlanr.net/Software/TCPtune/</a><br /><br /><br />REFERENCES:<br /><a href="http://dast.nlanr.net/Articles/GettingStarted/TCP_window_size.html">http://dast.nlanr.net/Articles/GettingStarted/TCP_window_size.html</a><br /><a href="http://ncne.nlanr.net/research/tcp/testrig/">http://ncne.nlanr.net/research/tcp/testrig/</a><br />A very useful presentation:<br />&nbsp;&nbsp;&nbsp; <a href="http://ncne.nlanr.net/training/techs/1998/980128/talks/welch">http://ncne.nlanr.net/training/techs/1998/980128/talks/welch</a><br /><br />General Info:<br /><a href="http://www.ncsa.uiuc.edu/People/vwelch/net_perf/tcp_windows.html">http://www.ncsa.uiuc.edu/People/vwelch/net_perf/tcp_windows.html</a><br /><a href="http://www.psc.edu/networking/perf_tune.html">http://www.psc.edu/networking/perf_tune.html</a>&nbsp; (outdated 1999 but useful)<br /><br /><a href="http://www.ncsa.uiuc.edu/People/vwelch/net_perf_tools.htm">http://www.ncsa.uiuc.edu/People/vwelch/net_perf_tools.htm</a><br /><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/6796938.html">根据域名获取IP地址的可重入版本gethostbyname_r</a> 2007-07-17</div><div><a href="http://morningsun.blogbus.com/logs/6616233.html">TCP 粘包及分段研究</a> 2007-07-11</div><div><a href="http://morningsun.blogbus.com/logs/395163.html">VoWLAN &amp;&amp; IPv6 Security</a> 2004-09-18</div><div><a href="http://morningsun.blogbus.com/logs/374932.html">2.5G和WLAN的融合</a> 2004-09-06</div><div><a href="http://morningsun.blogbus.com/logs/215182.html">SMIPv6 Overview</a> 2004-06-10</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F6893593.html&title=TCP+window+size+%28zz%29">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/6893593.html</link>
   <author>morningSun</author>
   <pubDate>Tue, 10 Jul 2007 17:30:45 +0800</pubDate>
  </item>
  <item>
   <title>Compile kernel 2.6.21, Upgrade GTK+2.0 (RH 8.0)</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 为了编译2.6的内核，使用make menuconfig/xconfig&nbsp;不是惨不忍睹就是失败（xconfig need Gtk+ &gt; 2.0）。不得已走上了编译GTK+2.0的路.</p><p>&nbsp;&nbsp;&nbsp; 依赖顺序如下：</p><p>首先将pkgconfig-0.15升上去，后面都要依赖它。它的作用主要是为configure 提供软件包的具体路径之用。</p><p>freetype-2.1.10 --&gt; fontconfig-2.4.1（for cario）</p><p>render-0.8--&gt;xrender-0.8.3&nbsp;</p><p>libpng-1.2.18, xproto-7.0.5, xrender-0.8.3, fontconfig-2.4.1--&gt; cairo-1.2.0</p><p>atk-1.10.1, pango-1.13.0, cairo-1.2.0, libglade-2.0.1, glib-2.12.0&nbsp;--&gt; gtk+-2.10.0</p><p>呼，终于升级完成了GTK+-2.0 版本</p><p>想编译2.6 的内核还需要升级binutils-2.17， 否则最后objcopy 会crash。&nbsp;最后还要升级module-init-tools-3.2，否则模块就算modules_install 后也别想加载起来。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://morningsun.blogbus.com/logs/11537559.html">cat功能</a> 2007-12-05</div><div><a href="http://morningsun.blogbus.com/logs/7338802.html">Linux 下创建基于Image的小分区</a> 2007-08-03</div><div><a href="http://morningsun.blogbus.com/logs/7302595.html">ORACLE 10g RAC failover and load balance configuration</a> 2007-08-02</div><div><a href="http://morningsun.blogbus.com/logs/6277999.html">初试Google Map APIs</a> 2007-07-02</div><div><a href="http://morningsun.blogbus.com/logs/6189203.html">MingGw and FileZilla compile</a> 2007-06-28</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fmorningsun.blogbus.com%2Flogs%2F6584745.html&title=Compile+kernel+2.6.21%2C+Upgrade+GTK%2B2.0+%28RH+8.0%29">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://www.blogbus.com" target="_blank">博客大巴，你的个人传媒早班车</a></b></div><br /><br />]]></description>
   <link>http://morningsun.blogbus.com/logs/6584745.html</link>
   <author>morningSun</author>
   <pubDate>Tue, 10 Jul 2007 16:23:11 +0800</pubDate>
  </item>
 </channel>
</rss>
