<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>D Programming Language 积学致远</title>
    <description>做了多年MIS，喜欢管理，爱好生活，沉迷编程，叹学海无涯，惜人生之短，借javaeye宝地，共塑我们共同的家，希望和大家多多交流！</description>
    <link>http://ideage.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>C/C++/D联合</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/210614" style="color:red;">http://ideage.javaeye.com/blog/210614</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          联合(union)在C/C++里面见得并不多，但是在一些对内存要求特别严格的地方，联合又是频繁出现，那么究竟什么是联合、怎么去用、有什么需要注意的地方呢？就这些问题，我试着做一些简单的回答，里面肯定还有不当的地方，欢迎指出！<br /><br />1、什么是联合？<br />   “联合”是一种特殊的类，也是一种构造类型的数据结构。 在一个“联合”内可以定义多种不同的数据类型， 一个被说明为该“联合”类型的变量中，允许装入该“联合”所定义的任何一种数据，这些数据共享同一段内存，已达到节省空间的目的（还有一个节省空间的类型：位域）。 这是一个非常特殊的地方，也是联合的特征。另外，同struct一样，联合默认访问权限也是公有的，并且，也具有成员函数。<br /><br />2、联合与结构的区别？<br />   “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间， 一个结构变量的总长度是各成员长度之和（空结构除外，同时不考虑边界调整）。而在“联合”中，各成员共享一段内存空间， 一个联合变量的长度等于各成员中最长的长度。应该说明的是， 这里所谓的共享不是指把多个成员同时装入一个联合变量内， 而是指该联合变量可被赋予任一成员值，但每次只能赋一种值， 赋入新值则冲去旧值。<br /><br />3、如何定义？<br />   例如：<br />    union test<br />    {<br />      test() { }<br />      int office;<br />      char teacher[5];<br />    }; <br />    定义了一个名为test的联合类型，它含有两个成员，一个为整型，成员名为office；另一个为字符数组，数组名为teacher。联合定义之后，即可进行联合变量说明，被说明为test类型的变量，可以存放整型量office或存放字符数组teacher。<br /><br />4、如何说明？<br />   联合变量的说明有三种形式：先定义再说明、定义同时说明和直接说明。<br />   以test类型为例，说明如下：<br />    1) union test<br />       {<br />         int office;<br />         char teacher[5];<br />       }; <br />       union test a,b;    /*说明a,b为test类型*/<br />    2) union test<br />       {<br />         int office;<br />         char teacher[5];<br />       } a,b;<br />    3) union <br />       {<br />         int office;<br />         char teacher[5];<br />       } a,b; <br />       经说明后的a,b变量均为test类型。<br />    a,b变量的长度应等于test的成员中最长的长度，即等于teacher数组的长度，共5个字节。a,b变量如赋予整型值时，只使用了4个字节，而赋予字符数组时，可用5个字节。<br /><br />5、如何使用？<br />   对联合变量的赋值，使用都只能是对变量的成员进行。<br />   联合变量的成员表示为：联合变量名.成员名 <br />   例如，a被说明为test类型的变量之后，可使用a.class、a.office <br />   不允许只用联合变量名作赋值或其它操作，也不允许对联合变量作初始化赋值，赋值只能在程序中进行。<br />   还要再强调说明的是，一个联合变量，每次只能赋予一个成员值。换句话说，一个联合变量的值就是联合变员的某一个成员值。<br /><br />6、匿名联合<br />   匿名联合仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法.例如：<br />     #include &lt;iostream><br />     void main()<br />     {<br />         union{ <br />                int test;<br />                char c; <br />               };          <br />        test=5;<br />        c=''a'';<br />        std::cout&lt;&lt;i&lt;&lt;" "&lt;&lt;c;<br />     }<br />    正如所见到的,联合成分象声明的普通局部变量那样被引用,事实上对于程序而言,这也正是使用这些变量的方式.另外,尽管被定义在一个联合声明中,他们与同一个程序快那的任何其他局部变量具有相同的作用域级别.这意味这匿名联合内的成员的名称不能与同一个作用域内的其他一直标志符冲突.<br />    对匿名联合还存在如下限制:<br />    因为匿名联合不使用点运算符，所以包含在匿名联合内的元素必须是数据,不允许有成员函数，也不能包含私有或受保护的成员。还有,全局匿名联合必须是静态(static)的，否则就必须放在匿名名字空间中。<br /><br />7、几点需要讨论的地方：<br />   1、联合里面那些东西不能存放？<br />      我们知道，联合里面的东西共享内存，所以静态、引用都不能用，因为他们不可能共享内存。<br />   2、类可以放入联合吗？<br />      我们先看一个例子：<br />      class Test<br />      {<br />      public:<br />    Test():data(0) { }<br />      private:<br />          int data;<br />      };<br /><br />     typedef union _test<br />     {<br />              Test test;<br />     }UI;   <br />     编译通不过，为什么呢？<br />     因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类，因为他们共享内存，编译器无法保证这些对象不被破坏，也无法保证离开时调用析够函数。<br /><br /><br />    8、又是匿名惹的祸？？<br />       我们先看下一段代码： <br />class test<br />{<br />        public:<br />             test(const char* p);<br />             test(int in);<br />             const operator char*() const {return data.ch;}<br />             operator long() const {return data.l;}<br />        private:<br />     enum type {Int, String };<br />       union <br />     {<br />            const char* ch;<br />            int i;<br />      }datatype;<br />      type stype;<br />      test(test&);<br />      test& operator=(const test&);<br />        };<br />       test::test(const char *p):stype(String),datatype.ch(p)     { }<br />       test::test(int in):stype(Int),datatype.l(i)     { }<br />     看出什么问题了吗？呵呵，编译通不过。为什么呢？难道datatype.ch(p)和datatype.l(i)有问题吗？<br />     哈哈，问题在哪呢？让我们来看看构造test对象时发生了什么，当创建test对象时，自然要调用其相应的构造函数，在构造函数中当然要调用其成员的构造函数，所以其要去调用datatype成员的构造函数，但是他没有构造函数可调用，所以出错。<br />     注意了，这里可并不是匿名联合！因为它后面紧跟了个data! <br /><br /><br />    9、如何有效的防止访问出错？<br />       使用联合可以节省内存空间，但是也有一定的风险：通过一个不适当的数据成员获取当前对象的值！例如上面的ch、i交错访问。<br />       为了防止这样的错误，我们必须定义一个额外的对象，来跟踪当前被存储在联合中的值得类型，我们称这个额外的对象为：union的判别式。<br />       一个比较好的经验是，在处理作为类成员的union对象时，为所有union数据类型提供一组访问函数。
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/210614#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:48:27 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/210614</link>
        <guid>http://ideage.javaeye.com/blog/210614</guid>
      </item>
      <item>
        <title>ANSI和Unicode练习后记</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/161800" style="color:red;">http://ideage.javaeye.com/blog/161800</a>&nbsp;
          发表时间: 2008年02月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先，再次问候大家，春节好！祝愿D语言社区兴旺发达，祝愿JavaEye蒸蒸日上！<br /><br />在前文中，已经讨论了如何调用ANSI和多字节的函数。本文目的是关于在D中如何更好应用。当然，很多人认为完全可以使用宽字符的函数，但是，有时候，你要调用的函数是ANSI函数（例如WinExec，仅仅有ANSI版本，不支持Unicode，当然你可以使用麻烦的ShellExecuteEx），你就必须了解Unicode的相关知识。建议阅读前文<a href="http://ideage.javaeye.com/blog/119177" target="_blank">http://ideage.javaeye.com/blog/119177</a>，运行相关例子，认真揣摩调用的几个用法。<br /><br /><br />1.首先要明白你使用的char是什么格式。char在D中，有两种格式：ANSI，Unicode。ANSI是和C兼容的。如果你的源码保存格式是UTF8，或者UTF32，那么你的char的格式就是Unicode；否则ANSI。明白char的格式，调用相关函数就好办了。<br /><br />2.根据格式调用。如果是ANSI格式，调用ANSI函数时，使用std.string.toStringz函数就可以了。如果源码是Unicode格式，如果继续使用前面的方法，调用会失败。很幸运的，你只要理解了格式，就知道解决办法。<br /><br />3.源码是Unicode格式时，调用ANSI函数，要使用字节转换。代码说话：<br /><pre name="code" class="java">
wchar[] a2w( char[] a ) 
{
	return toUTF16(a); 
} 

char[] wcs2mbz(wchar[] ws)    
{    
    uint codepage =  1; //2000/+    
    char[] rz;     
    rz.length = WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, null, 0, null, null) + 1;    
    WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, rz.ptr, rz.length, null, null);    
    rz[rz.length-1] = 0;    
    rz.length = rz.length-1;    
    return rz;    
}    

char[] uc2cz(char[] a)
{
	return wcs2mbz(a2w(a));
}
</pre><br /><br /><br />调用uc2cz转换，然后传递转换后的指针就可以了：<br />char[] files="c:\NotePad.exe";<br />WinExec( uc2cz(files).ptr,1);<br /><br />4.上述的很简单，如果有错误，请大家指正！谢谢！
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/161800#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 10 Feb 2008 09:17:23 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/161800</link>
        <guid>http://ideage.javaeye.com/blog/161800</guid>
      </item>
      <item>
        <title>火车站滞留旅客带来的思考</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/159796" style="color:red;">http://ideage.javaeye.com/blog/159796</a>&nbsp;
          发表时间: 2008年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今年的南方出现的反常天气,损失巨大.看了连续的报道,想到在冰冷的户外等候列车的人们,心更沉重.出门在外真难.象战斗一样对待春运,真不战斗还难.<br /><br />世界上人口最多的国家让我自豪.最大的移民潮流也在上演.农村的人口都将转移到城市.城市,巨大的城市.房价的节节攀升,带来了很多社会财富.移民正在撑起增长的强劲动力.<br /><br />我所给移民象到的:<br /><br />1.饱暖很关键.<br />2.厕所,电力,通讯.<br />3.后勤服务人员,药品,医护人员.<br />4.最好给大家一些简单的娱乐:电视,报纸.<br /><br /><br />如何给更多人带来福祉,让更多的人生活美好,不负众望的预案,期待明天更美好!
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/159796#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Jan 2008 22:51:11 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/159796</link>
        <guid>http://ideage.javaeye.com/blog/159796</guid>
      </item>
      <item>
        <title>D语言的IOCP（完成端口）例子</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/133862" style="color:red;">http://ideage.javaeye.com/blog/133862</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在WindowsNT平台上，最具有伸缩性和吞吐量的网络服务器程序都使用了<font face="Arial">完成端口</font>。为了在D中使用<font face="Arial">完成端口，我写了这个简单的例子。希望大家指正！</font></p>
<p>在DMD1.020－1.022，WindowsXP，编译测试通过。</p>
<p>没有使用std.socket，因为std里面的socket实现不能使用重叠IO。</p>
<div class="code_title">D&nbsp;代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;D&nbsp;Program&nbsp;Language&nbsp;IOCP&nbsp; </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="comment">//&nbsp;write&nbsp;by&nbsp;ideage@gmail.com </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;complie:&nbsp;dmd&nbsp;ic&nbsp;ws2_32.lib </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>import&nbsp;std.c.windows.windows,&nbsp;std.c.windows.winsock; &nbsp;&nbsp;</span> </li>
    <li class=""><span>import&nbsp;std.</span><span class="keyword">string</span><span>,&nbsp;std.stdint,&nbsp;std.c.</span><span class="keyword">string</span><span>,&nbsp;std.c.stdlib; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>import&nbsp;std.stdio; &nbsp;&nbsp;</span> </li>
    <li class=""><span>import&nbsp;std.thread; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;HANDLE&nbsp;WSAEVENT; &nbsp;&nbsp;</span> </li>
    <li class=""><span>alias&nbsp;OVERLAPPED&nbsp;WSAOVERLAPPED; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;OVERLAPPED*&nbsp;LPWSAOVERLAPPED; &nbsp;&nbsp;</span> </li>
    <li class=""><span>alias&nbsp;OVERLAPPED*&nbsp;POVERLAPPED,&nbsp;LPOVERLAPPED; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">struct</span><span>&nbsp;GUID&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>align(1): &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;Data1; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;Data2; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;Data3; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;Data4[8]; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">struct</span><span>&nbsp;WSAPROTOCOLCHAIN&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChainLen; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD[7]&nbsp;ChainEntries; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;WSAPROTOCOLCHAIN*&nbsp;LPWSAPROTOCOLCHAIN; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">const</span><span>&nbsp;WSAPROTOCOL_LEN&nbsp;=&nbsp;255; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">const</span><span>&nbsp;ERROR_IO_PENDING&nbsp;=&nbsp;997; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">struct</span><span>&nbsp;WSAPROTOCOL_INFOW&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwServiceFlags1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwServiceFlags2; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwServiceFlags3; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwServiceFlags4; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwProviderFlags; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;GUID&nbsp;ProviderId; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwCatalogEntryId; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;WSAPROTOCOLCHAIN&nbsp;ProtocolChain; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iVersion; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iAddressFamily; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iMaxSockAddr; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iMinSockAddr; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iSocketType; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iProtocol; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iProtocolMaxOffset; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iNetworkByteOrder; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;iSecurityScheme; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwMessageSize; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwProviderReserved; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;WCHAR[WSAPROTOCOL_LEN+1]&nbsp;szProtocol; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;WSAPROTOCOL_INFOW*&nbsp;LPWSAPROTOCOL_INFOW; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">const</span><span>&nbsp;WSA_FLAG_OVERLAPPED&nbsp;=&nbsp;0x01; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">struct</span><span>&nbsp;WSABUF&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;&nbsp;len; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>*&nbsp;buf; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">struct</span><span>&nbsp;SOCKADDR&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">ushort</span><span>&nbsp;&nbsp;sa_family; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[14]&nbsp;sa_data; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;SOCKADDR*&nbsp;PSOCKADDR,&nbsp;LPSOCKADDR; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;WSABUF*&nbsp;LPWSABUF; &nbsp;&nbsp;</span> </li>
    <li class=""><span>alias&nbsp;</span><span class="keyword">uint</span><span>&nbsp;GROUP; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">extern</span><span>(Windows) &nbsp;&nbsp;</span> </li>
    <li class=""><span>{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;</span><span class="keyword">void</span><span>&nbsp;function(DWORD,&nbsp;DWORD,&nbsp;LPWSAOVERLAPPED,&nbsp;DWORD)&nbsp;LPWSAOVERLAPPED_COMPLETION_ROUTINE; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;WSASocketW(</span><span class="keyword">int</span><span>,&nbsp;</span><span class="keyword">int</span><span>,&nbsp;</span><span class="keyword">int</span><span>,&nbsp;LPWSAPROTOCOL_INFOW,&nbsp;GROUP,&nbsp;DWORD);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">bool</span><span>&nbsp;GetQueuedCompletionStatus(HANDLE,&nbsp;PDWORD,&nbsp;PDWORD,&nbsp;LPOVERLAPPED*,&nbsp;DWORD);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;CreateIoCompletionPort(HANDLE,&nbsp;HANDLE,&nbsp;DWORD,&nbsp;DWORD);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;WSASend(SOCKET,&nbsp;LPWSABUF,&nbsp;DWORD,&nbsp;LPDWORD,&nbsp;DWORD,&nbsp;LPWSAOVERLAPPED,&nbsp;LPWSAOVERLAPPED_COMPLETION_ROUTINE); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;WSARecv(SOCKET,&nbsp;LPWSABUF,&nbsp;DWORD,&nbsp;LPDWORD,&nbsp;LPDWORD,&nbsp;LPWSAOVERLAPPED,&nbsp;LPWSAOVERLAPPED_COMPLETION_ROUTINE); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>alias&nbsp;WSASocketW&nbsp;WSASocket; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;Maximum&nbsp;Buffer&nbsp;Size </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;BUFFERSIZE&nbsp;=&nbsp;&nbsp;128; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">enum</span><span>&nbsp;IO_OPERATION &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{&nbsp;&nbsp;&nbsp;ACCEPT,READ,WRITE&nbsp;}; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">struct</span><span>&nbsp;PIO_DATA &nbsp;&nbsp;</span> </li>
    <li class=""><span>{&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WSAOVERLAPPED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ol; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer[BUFFERSIZE]; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WSABUF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsabuf; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&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;nTotalBytes; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&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;nSentBytes; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;IO_OPERATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opCode;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;activeSocket;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">int</span><span>&nbsp;max_ThreadCount; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>HANDLE&nbsp;iocpHandle&nbsp;=&nbsp;INVALID_HANDLE_VALUE; &nbsp;&nbsp;</span> </li>
    <li class=""><span>SOCKET&nbsp;serverSock; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">int</span><span>&nbsp;WorkerThread&nbsp;(</span><span class="keyword">void</span><span>&nbsp;*&nbsp;context) &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;LPWSAOVERLAPPED&nbsp;lpol&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;PIO_DATA*&nbsp;lpIOContext&nbsp;&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;WSABUF&nbsp;buffSend; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;dwRecvNumBytes&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;dwSendNumBytes&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;dwFlags&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;dwIoSize&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">bool</span><span>&nbsp;bSuccess&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;nRet&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(&nbsp;1&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;*&nbsp;lpCompletionKey&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bSuccess&nbsp;=&nbsp;GetQueuedCompletionStatus(iocpHandle,&nbsp;&amp;dwIoSize,cast(LPDWORD)&amp;lpCompletionKey,cast(LPOVERLAPPED&nbsp;*)&amp;lpol,&nbsp;INFINITE); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;!bSuccess&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;GetQueuedCompletionStatus()&nbsp;failed:&nbsp;%s.&quot;</span><span>,GetLastError()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext&nbsp;=&nbsp;cast(PIO_DATA&nbsp;*&nbsp;)lpol;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(dwIoSize&nbsp;==&nbsp;0)&nbsp;</span><span class="comment">//socket&nbsp;closed? </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;ClientSocket&nbsp;Disconnect!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(lpIOContext.activeSocket); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;delete&nbsp;lpIOContext; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(lpIOContext.opCode&nbsp;==&nbsp;IO_OPERATION.READ)&nbsp;</span><span class="comment">//&nbsp;a&nbsp;read&nbsp;operation&nbsp;complete </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;s&nbsp;=&nbsp;</span><span class="string">&quot;Echo:&quot;</span><span>&nbsp;~&nbsp;&nbsp;std.</span><span class="keyword">string</span><span>.toString(lpIOContext.wsabuf.buf);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.wsabuf.buf&nbsp;=&nbsp;std.</span><span class="keyword">string</span><span>.toStringz(s); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.nTotalBytes&nbsp;&nbsp;=&nbsp;lpIOContext.wsabuf.len; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.nSentBytes&nbsp;&nbsp;&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.opCode&nbsp;=&nbsp;IO_OPERATION.WRITE; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;=&nbsp;WSASend( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;lpIOContext.activeSocket, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&amp;lpIOContext.wsabuf,&nbsp;1,&nbsp;&amp;dwSendNumBytes, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;dwFlags, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&amp;(lpIOContext.ol)&nbsp;,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;nRet&nbsp;==&nbsp;SOCKET_ERROR&nbsp;&amp;&amp;&nbsp;(ERROR_IO_PENDING&nbsp;!=&nbsp;WSAGetLastError())&nbsp;)&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;1.WASSend&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,WSAGetLastError()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(lpIOContext.activeSocket);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(lpIOContext.opCode&nbsp;==&nbsp;IO_OPERATION.WRITE)&nbsp;</span><span class="comment">//a&nbsp;write&nbsp;operation&nbsp;complete </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.nSentBytes&nbsp;&nbsp;+=&nbsp;dwIoSize; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;lpIOContext.nSentBytes&nbsp;&lt;&nbsp;lpIOContext.nTotalBytes&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.opCode&nbsp;=&nbsp;IO_OPERATION.WRITE; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;A&nbsp;Write&nbsp;operation&nbsp;has&nbsp;not&nbsp;completed&nbsp;yet,&nbsp;so&nbsp;post&nbsp;another </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Write&nbsp;operation&nbsp;to&nbsp;post&nbsp;remaining&nbsp;data. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffSend.buf&nbsp;=&nbsp;lpIOContext.Buffer.ptr&nbsp;+&nbsp;lpIOContext.nSentBytes;&nbsp;</span><span class="comment">//offset. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffSend.len&nbsp;=&nbsp;lpIOContext.nTotalBytes&nbsp;-&nbsp;lpIOContext.nSentBytes; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;=&nbsp;WSASend&nbsp;(lpIOContext.activeSocket, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&amp;buffSend,&nbsp;1,&nbsp;&amp;dwSendNumBytes, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&nbsp;&nbsp;&nbsp;dwFlags, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&amp;(lpIOContext.ol),&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;nRet&nbsp;==&nbsp;SOCKET_ERROR&nbsp;&amp;&amp;&nbsp;(ERROR_IO_PENDING&nbsp;!=&nbsp;WSAGetLastError())&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;2.WASSend&nbsp;Failed,Ret:%s.&quot;</span><span>,WSAGetLastError()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(lpIOContext.activeSocket);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Write&nbsp;operation&nbsp;completed,&nbsp;so&nbsp;post&nbsp;Read&nbsp;operation. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.opCode&nbsp;=&nbsp;IO_OPERATION.READ;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwRecvNumBytes&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.wsabuf.buf&nbsp;=&nbsp;lpIOContext.Buffer.ptr,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.ol.Internal&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.ol.InternalHigh&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.ol.Offset&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.ol.OffsetHigh&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.ol.hEvent&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpIOContext.wsabuf.len&nbsp;=&nbsp;BUFFERSIZE; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRet&nbsp;=&nbsp;WSARecv( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;&nbsp;&nbsp;lpIOContext.activeSocket, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&nbsp;&nbsp;&amp;lpIOContext.wsabuf,&nbsp;1,&nbsp;&amp;dwRecvNumBytes, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;&nbsp;&nbsp;&amp;dwFlags, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&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;&nbsp;&nbsp;&amp;lpIOContext.ol,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;nRet&nbsp;==&nbsp;SOCKET_ERROR&nbsp;&amp;&amp;&nbsp;(ERROR_IO_PENDING&nbsp;!=&nbsp;WSAGetLastError())&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;1.WASRecv&nbsp;Failed,Ret:%s.&quot;</span><span>,WSAGetLastError()&nbsp;&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(lpIOContext.activeSocket);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">int</span><span>&nbsp;main&nbsp;() &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;{&nbsp;</span><span class="comment">//&nbsp;Init&nbsp;winsock2.2 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;retVal&nbsp;=&nbsp;-1; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;(retVal&nbsp;=&nbsp;WSAStartup(0x2020,&nbsp;&amp;wsaData))&nbsp;!=&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;WSAStartup&nbsp;Failed,Ret:&nbsp;%s&quot;</span><span>&nbsp;,retVal); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;WSAStartup&nbsp;Init&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;socket </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serverSock&nbsp;=&nbsp;WSASocket(AF_INET,SOCK_STREAM,&nbsp;IPPROTO_TCP,&nbsp;</span><span class="keyword">null</span><span>,0,WSA_FLAG_OVERLAPPED); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;serverSock&nbsp;==&nbsp;INVALID_SOCKET&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Server&nbsp;Socket&nbsp;Creation&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;WSAGetLastError()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Create&nbsp;socket&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;</span><span class="comment">//bind </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;service; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.sin_family&nbsp;=&nbsp;AF_INET; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.sin_addr.s_addr&nbsp;=&nbsp;htonl(INADDR_ANY); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.sin_port&nbsp;=&nbsp;htons(9001); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;retVal&nbsp;=&nbsp;bind(serverSock,cast(sockaddr&nbsp;*)&amp;service,service.</span><span class="keyword">sizeof</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;retVal&nbsp;==&nbsp;SOCKET_ERROR&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Server&nbsp;Soket&nbsp;Bind&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;WSAGetLastError()&nbsp;);; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Binding&nbsp;ServerSocket&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;</span><span class="comment">//listen </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;retVal&nbsp;=&nbsp;listen(serverSock,&nbsp;8); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(&nbsp;retVal&nbsp;==&nbsp;SOCKET_ERROR&nbsp;)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Server&nbsp;Socket&nbsp;Listen&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;WSAGetLastError()&nbsp;);; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;ServerSocket&nbsp;listen&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//create&nbsp;iocp&nbsp;&amp;&nbsp;binding&nbsp;serverSocket&nbsp;to&nbsp;iocp </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Create&nbsp;IOCP </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_ThreadCount&nbsp;=&nbsp;1&nbsp;*&nbsp;2; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iocpHandle&nbsp;=&nbsp;CreateIoCompletionPort(INVALID_HANDLE_VALUE,</span><span class="keyword">null</span><span>,0,max_ThreadCount); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(iocpHandle&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;CreateIoCompletionPort()&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;GetLastError()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(CreateIoCompletionPort(cast(HANDLE)serverSock,iocpHandle,0,0)&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Binding&nbsp;Server&nbsp;Socket&nbsp;to&nbsp;IO&nbsp;Completion&nbsp;Port&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;GetLastError()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Create&nbsp;IOCP&nbsp;&amp;&nbsp;binding&nbsp;ServerSocket&nbsp;to&nbsp;IOCP&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;worker&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Thread(&amp;WorkerThread,&nbsp;cast(</span><span class="keyword">void</span><span>&nbsp;*)0); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worker.start(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Create&nbsp;Worker&nbsp;threads&nbsp;OK,&nbsp;Waitting&nbsp;Client&nbsp;Connect...&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span class="comment">//accept&nbsp;new&nbsp;connection </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(1) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;clientsock&nbsp;=&nbsp;accept(&nbsp;serverSock,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(clientsock&nbsp;==&nbsp;SOCKET_ERROR)&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Client&nbsp;connected.&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span class="comment">//diable&nbsp;buffer&nbsp;to&nbsp;improve&nbsp;performance </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;nZero&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setsockopt(clientsock,&nbsp;SOL_SOCKET,&nbsp;SO_SNDBUF,&nbsp;cast(</span><span class="keyword">char</span><span>&nbsp;*)&amp;nZero,&nbsp;nZero.</span><span class="keyword">sizeof</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&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;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//binding&nbsp;ClientSocket&nbsp;to&nbsp;IOCP </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(CreateIoCompletionPort(cast(HANDLE)clientsock,iocpHandle,0,0)&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Binding&nbsp;Client&nbsp;Socket&nbsp;to&nbsp;IO&nbsp;Completion&nbsp;Port&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;GetLastError()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(clientsock); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;binding&nbsp;ClientSocket&nbsp;to&nbsp;IOCP&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//post&nbsp;a&nbsp;recv&nbsp;request </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIO_DATA&nbsp;data; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.opCode&nbsp;=&nbsp;IO_OPERATION.READ; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.nTotalBytes&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.nSentBytes&nbsp;&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.wsabuf.buf&nbsp;&nbsp;=&nbsp;data.Buffer.ptr; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.wsabuf.len&nbsp;&nbsp;=&nbsp;data.Buffer.</span><span class="keyword">sizeof</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.activeSocket&nbsp;=&nbsp;clientsock; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;dwRecvNumBytes=0,dwFlags=0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;nRet&nbsp;=&nbsp;WSARecv(clientsock,&amp;data.wsabuf,&nbsp;1,&nbsp;&amp;dwRecvNumBytes,&amp;dwFlags,&amp;data.ol,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(nRet&nbsp;==&nbsp;SOCKET_ERROR&nbsp;&nbsp;&amp;&amp;&nbsp;(ERROR_IO_PENDING&nbsp;!=&nbsp;WSAGetLastError())){ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;3.WASRecv&nbsp;Failed,Ret:%s.&quot;</span><span>&nbsp;,&nbsp;WSAGetLastError()&nbsp;);; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closesocket(clientsock); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//delete&nbsp;data; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefln(</span><span class="string">&quot;Post&nbsp;a&nbsp;recv&nbsp;request&nbsp;IOCP&nbsp;OK!&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//close&nbsp;&amp;&nbsp;Cleanup </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;closesocket(serverSock); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;WSACleanup(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/133862#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Oct 2007 20:43:52 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/133862</link>
        <guid>http://ideage.javaeye.com/blog/133862</guid>
      </item>
      <item>
        <title>那个美国老太忽悠了十三亿中国人(转帖)</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/130030" style="color:red;">http://ideage.javaeye.com/blog/130030</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postText">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 曾几何时，国人中悄然流行起这样一个寓言故事，说是有个中国老太太和美国老太太，中国老太太说我工作了一辈子，终于存够了买房子的钱，而那个美国老太太说，我工作了一辈子，终于把银行的房贷还清了。寓言不言而喻，当中国人捂紧钱包节衣缩食的时候美国人却在潇洒地借贷消费。这个寓言似乎要教导我们，作为中国人，你别捂紧钱包，放心地去消费吧。往小处说，等你存够了可以潇洒的钱以后你已经老了，没有岁月留给你潇洒了，看看人家美国人，今天花明天的钱多潇洒；往大了说，只有咱老百姓放开钱包和胆量超前消费，国家才能欣欣向荣，瞧瞧人家美国，就是人家老百姓今天敢花明天的钱，所以人家才那么富裕。于是乎，那些经济学家响应号召，纷纷给咱小老百姓免费上起了宏观经济学教程：刺激经济增长的三驾马车是消费、投资和出口。第一位的就是消费，只有刺激了内需，经济才能快速增长，那可是有个响当当的学名叫做&ldquo;消费拉动型增长&rdquo;。因此百姓们，响应政府号召敞开钱包超前消费吧。
<p>&nbsp;</p>
<p>&nbsp;　　政府的号召、学者的高论、媒体的宣传、再加上那个不知从哪里冒出来的美国老太太拿把小扇子在边上扇几下忽悠的小风，我们这些小老百姓们着实有点眼晕了。孔明老先生不是说过俭以养德吗，我们的伟人不也是都告诫我们要艰苦朴素吗，敢情那都是老黄历了啊。中国不是入世了吗，那就得有世界的眼光，看看老外住小楼，开汽车满世界晃悠，我们守了一辈子的一室一厅和&ldquo;永久牌&rdquo;，连我们的友好邻邦新马泰都没有去开过眼，想起来简直差点白活了一辈子。</p>
<p>&nbsp;　　伟大的领袖曾经说过，咱们国人人有多大胆地有多大产，不怕做不到就怕想不到。这不，我们国人终于想到了，那就要好好地做得惊天动地一把，怎么着也不能让那个美国的老太太小瞧了中国人吧。打开存折看看还有这么几万，要不先买房子吧。人那儿不是零首付吗，不用花一分钱就可以住进大房子，一家三口四口五口其乐融融。原来天底下最划算的就是借贷消费了，那个美国老太太要是知道咱中国人如今也住进大房子而且不花一分钱，保不齐就得惊讶得冒出句中文&ldquo;当今世界殊&rdquo;来也未可知。谁说咱国人就得艰苦一辈子，国家都入世了，咱还不得有点世界眼光，否则怎么达到中等发达国家水平呢。要保持世界水平首先就得和老外一样消费。打开电视，真是不看不知道世界真奇妙。原来过去穿的衣服上有个鳄鱼就开始显摆的人傻眼了，敢情老外们眼中的品牌是范司哲香奈尔，那才叫身份。来人啊，信用卡伺候！国人的力量果然是无穷的，这回轮到老外傻眼了。巴黎埃菲尔铁塔边上的免税店里三位中国农村模样的妇女一次买走了50万欧元商品的故事不得不让法国人惊讶地用手托住下巴。</p>
<p>&nbsp;　　不到10年的时间中，许多国人开始了自己&ldquo;负翁&rdquo;的生活。坐拥着上百万市价的房子也承受着上千元甚至几千元一月的还款。当然人们渐渐发现他所承受的远不止这几千元一月的房贷，还有高昂的医疗费，高昂的子女教育费，当然还包括增长速度让世界也瞠目结舌的更高昂的房价。而国人的腰包没有鼓出来多少，催款的账单却越来越多。蓦然回首，国人竟然发现自己原本平静的生活竟然被一个美国的老太太给改变了。再看看人家美国的老太太原来她生病不用自己花钱，养老有政府包办，怪不得人家腰杆这么硬，直嚷嚷要今天花明天的钱。而现在人家却在反思消费主义的泛滥。再看看我们，原来自费的项目是那么的多，却傻乎乎地跟着那个可恶的美国老太太去当负翁，我们的明天又该怎么办呢？</p>
<p>&nbsp;　　现在我们不仅要扪心自问，我们到底是被那个美国老太太给忽悠了，还是根本就是自己造了个莫须有的美国老太太来自己忽悠了自己。 </p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/130030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 11:20:45 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/130030</link>
        <guid>http://ideage.javaeye.com/blog/130030</guid>
      </item>
      <item>
        <title>转帖N个笑话,N个道理</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/123923" style="color:red;">http://ideage.javaeye.com/blog/123923</a>&nbsp;
          发表时间: 2007年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3"><span id="topicinfo__ctl0_Label2">　　*.扶着墙进扶着墙出-------吃自助餐的最高境界. <br />
<br />
　　*.你以为番茄炒蛋加点水就是番茄蛋汤吗？那区别大了去了！ <br />
<br />
　　*.---受不了! <br />
　　　---那就胖吧! <br />
<br />
　　*.不想吃天鹅肉的癞蛤蟆不是好癞蛤蟆! <br />
<br />
　　*.吃了天鹅肉的癞蛤蟆还是癞蛤蟆!! <br />
<br />
　　*.走自己的路，让其他人打的去吧 <br />
<br />
　　*.我不能给你幸福，但可以让你舒服&hellip;&hellip; <br />
<br />
　　*.吃了三天斋就想上西天&mdash;&mdash;功底还浅 <br />
<br />
　　*.时间就象女人的乳沟，挤一挤总还是有的~ <br />
<br />
　　*.愤青和爱国仅有一步之遥，和SB一步都没有 <br />
<br />
　　*.金钱不能买到一切但能买到我,暴力不能解决一切但能解决你 <br />
<br />
　　*.想当爷,得先当孙子 <br />
<br />
　　*.如果&lt;福布斯&gt;上没有我,我就去上班! <br />
<br />
　　*.在错误的路上,就算奔跑也没有用! <br />
<br />
　　*.只有站得高才能尿得远~~~ <br />
<br />
　　*.寂寞是种感觉，一个人并不寂寞，想念一个人才寂寞！ <br />
<br />
　　*.神是最卑鄙的：给你希望却永不实现；而恶魔是最诚实的：我给你你想要的，但是拿你的灵魂来换 <br />
<br />
　　*.甲：我跟你讲啊，我今天看见好多尼姑在公园散步啊 <br />
　　　乙：是啊，是早上吧，昨天报纸说一个尼姑在散步被强暴了！ <br />
<br />
　　*.世界上本没有神的，祈祷的人多了，也就有了 <br />
<br />
　　*.老婆像小灵通经济实惠但限本地使用，二奶像中国电信安全固定但带不出门，小蜜像中国移动使用方便但话费太贵。情人像中国联通优雅新潮但常不在服务区！ <br />
<br />
　　*.上帝会把我们身边最好的东西拿走,以提示我们拥有的太多 <br />
<br />
　　*.你不能让所有人满意，因为不是所有的人都是人！&nbsp; </span></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/123923#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Sep 2007 19:37:36 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/123923</link>
        <guid>http://ideage.javaeye.com/blog/123923</guid>
      </item>
      <item>
        <title>教师节后记</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/122987" style="color:red;">http://ideage.javaeye.com/blog/122987</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>三人行，必有我师。</p>
<p>师者，传道 授业 解惑也。</p>
<p>每个人都会有心中深刻记忆的老师。他们曾经在幼小的心灵中，给你强大的信心和动力，给你深深的帮助和情义。他们的无私和奉献，给你带来深深的爱。这一切，在今天，长大的我，也感慨良多。</p>
<p>一个给我树立信心老师，一个让我有了自知的老师，一个给我方法和爱心的老师，一个鼓励我支持我的老师，一个改变我思想教我做人的老师，一个让我实践的老师，你们的帮助，让我有万语千言不能表达，让我感谢也无法释怀的，我只能，也只会永远记住你们，在心中默默祈祷和祝愿：身体健康，桃李天下！</p>
<p>好老师可遇不可求。但是你遇见了，你会错过吗？</p>
<p>我要把大师当我的老师。去读他们写的书，看他们写的代码，研究他们的思想，沿着巨人的肩膀。。。</p>
<p>&nbsp;</p>
<p>祝愿所有的老师天天快乐！</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/122987#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 20:06:36 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/122987</link>
        <guid>http://ideage.javaeye.com/blog/122987</guid>
      </item>
      <item>
        <title>ANSI和Unicode练习</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/119177" style="color:red;">http://ideage.javaeye.com/blog/119177</a>&nbsp;
          发表时间: 2007年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>每个使用C或者C++直到D的人都要认识到的Unicode问题：</strong></p>
<p><strong>如果你的程序要在更广的国度使用，或者要进入Internet，你都要使用Unicode！</strong></p>
<p>先列个提纲，细节解释待续！</p>
<p><strong>1.编码 ansi，mbcs/dbcs，unicode，ucs2</strong></p>
<p><strong>2.类型 ansi char&nbsp;，utf8 char，wchar，dchar</strong></p>
<p><strong>3.类型的指针和内存复制</strong></p>
<p><strong>4.windows的知识</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; windwos98，2000，windowsCE</p>
<div class="code_title">D代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;import&nbsp;std.c.</span><span class="keyword">string</span><span>; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;import&nbsp;std.</span><span class="keyword">string</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;import&nbsp;std.utf; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//win32 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>import&nbsp;win32.windows; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>template&nbsp;zstr(T)&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;T[]&nbsp;zstr(T[]&nbsp;chars)&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;l&nbsp;=&nbsp;chars.length; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;chars.length&nbsp;=&nbsp;l&nbsp;+&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;chars[l]&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;chars; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;w2a(&nbsp;wchar[]&nbsp;w&nbsp;)&nbsp;&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;toUTF8(w);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;w2az(&nbsp;wchar[]&nbsp;w&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(</span><span class="keyword">char</span><span>)(w2a(w));&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;wz2a(&nbsp;wchar*&nbsp;w&nbsp;)&nbsp;&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;toUTF8(&nbsp;wz2w(w)&nbsp;);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;wz2az(&nbsp;wchar*&nbsp;w&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(</span><span class="keyword">char</span><span>)(wz2a(w));&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>wchar[]&nbsp;a2w(&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;a&nbsp;)&nbsp;&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;toUTF16(a);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>wchar[]&nbsp;a2wz(&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;a&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(wchar)(a2w(a));&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>wchar[]&nbsp;az2w(&nbsp;</span><span class="keyword">char</span><span>*&nbsp;a&nbsp;)&nbsp;&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;toUTF16(&nbsp;az2a(a)&nbsp;);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>wchar[]&nbsp;az2wz(&nbsp;</span><span class="keyword">char</span><span>*&nbsp;a&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(wchar)(az2w(a));&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>wchar[]&nbsp;wz2w(&nbsp;wchar*&nbsp;w&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;w?&nbsp;w[0..wcslen(w)]:&nbsp;</span><span class="keyword">null</span><span>;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;az2a(&nbsp;</span><span class="keyword">char</span><span>*&nbsp;a&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;a?&nbsp;a[0..strlen(a)]:&nbsp;</span><span class="keyword">null</span><span>;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>wchar[]&nbsp;w2wz(&nbsp;wchar[]&nbsp;w&nbsp;)&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(wchar)(w);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">char</span><span>[]&nbsp;&nbsp;a2az(&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;a&nbsp;)&nbsp;&nbsp;&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;zstr!(</span><span class="keyword">char</span><span>)(a);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">uint</span><span>&nbsp;CP_ACP&nbsp;&nbsp;=&nbsp;&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;default&nbsp;to&nbsp;ANSI&nbsp;code&nbsp;page&nbsp;*/</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">const</span><span>&nbsp;</span><span class="keyword">uint</span><span>&nbsp;CP_OEMCP&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;default&nbsp;to&nbsp;OEM&nbsp;&nbsp;code&nbsp;page&nbsp;*/</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">//&nbsp;wchar[]&nbsp;to&nbsp;multibyte&nbsp;string,&nbsp;zero&nbsp;terminated </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">char</span><span>[]&nbsp;wcs2mbz(wchar[]&nbsp;ws) &nbsp;&nbsp;</span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;codepage&nbsp;=&nbsp;&nbsp;CP_OEMCP;&nbsp;</span><span class="comment">//2000/+ </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;rz;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rz.length&nbsp;=&nbsp;WideCharToMultiByte(codepage,&nbsp;0,&nbsp;ws.ptr,&nbsp;ws.length,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;0,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>)&nbsp;+&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;WideCharToMultiByte(codepage,&nbsp;0,&nbsp;ws.ptr,&nbsp;ws.length,&nbsp;rz.ptr,&nbsp;rz.length,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rz[rz.length-1]&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;rz.length&nbsp;=&nbsp;rz.length-1; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;rz; &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">//&nbsp;multibyte&nbsp;string&nbsp;to&nbsp;wide&nbsp;string </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>wchar[]&nbsp;mbz2wcs(</span><span class="keyword">char</span><span>[]&nbsp;s) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">uint</span><span>&nbsp;codepage&nbsp;=&nbsp;&nbsp;CP_OEMCP;&nbsp;</span><span class="comment">//2000/+ </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;wchar[]&nbsp;rz;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;rz.length&nbsp;=&nbsp;MultiByteToWideChar(codepage,&nbsp;0,&nbsp;s.ptr,&nbsp;s.length,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;0)&nbsp;+&nbsp;1; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;MultiByteToWideChar(codepage,&nbsp;0,&nbsp;s.ptr,&nbsp;s.length,&nbsp;rz.ptr,&nbsp;rz.length); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;rz[rz.length-1]&nbsp;=&nbsp;0; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rz.length&nbsp;=&nbsp;rz.length-1; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;rz; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main()&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;ctext,ccaption;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;wchar[]&nbsp;wtext,wcaption; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;wcaption=</span><span class="string">&quot;中文软件a1A&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ccaption=</span><span class="string">&quot;中文软件a1A&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;wtext=</span><span class="string">&quot;1.unicode的windows函数&nbsp;调用宽字符：直接转换为0结尾的字符串，&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(</span><span class="keyword">null</span><span>,&nbsp;w2wz(wtext).ptr,&nbsp;w2wz(wcaption).ptr,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ctext=</span><span class="string">&quot;2.unicode的windows函数&nbsp;调用普通字符：转换utf16的0结尾的字符串，&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(</span><span class="keyword">null</span><span>,&nbsp;a2wz(ctext).ptr,&nbsp;a2wz(ccaption).ptr,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;wtext=</span><span class="string">&quot;3.ANSI的windows函数&nbsp;调用宽字符：转换为toUTF8的0结尾的字符串,标题乱码，&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxA(</span><span class="keyword">null</span><span>,&nbsp;wcs2mbz(wtext).ptr,&nbsp;w2az(wcaption).ptr,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;wtext=</span><span class="string">&quot;4.ANSI的windows函数&nbsp;调用宽字符：用WideCharToMultiByte转换为0结尾的ANSI字符串，&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxA(</span><span class="keyword">null</span><span>,&nbsp;wcs2mbz(wtext).ptr,&nbsp;wcs2mbz(wcaption).ptr,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ctext=</span><span class="string">&quot;5.ANSI的windows函数&nbsp;调用普通字符：用WideCharToMultiByte转换为0结尾的ANSI字符串，标题乱码.&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">////&nbsp;convert&nbsp;UTF-8&nbsp;to&nbsp;MBCS </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxA(</span><span class="keyword">null</span><span>,&nbsp;wcs2mbz(a2w(ctext)).ptr,&nbsp;a2az(ccaption).ptr,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONEXCLAMATION);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/* </span>&nbsp; </li>
    <li class=""><span><span class="comment">&nbsp;1.调用ANSI函数 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;2.调用Unicode函数 </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp; </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp;3.函数返回值，分配内存： </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;4.调用要使用字符数量：chars.sizeof/wchar.sizeof&nbsp;=chars.length </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="comment">&nbsp; </span>&nbsp;</span> </li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/119177#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Sep 2007 12:07:21 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/119177</link>
        <guid>http://ideage.javaeye.com/blog/119177</guid>
      </item>
      <item>
        <title>DFL Printting!</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/117589" style="color:red;">http://ideage.javaeye.com/blog/117589</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>将打印的代码从DWT,添加到DFL中,从而让DFL拥有打印的功能.</p><p><a href="http://wiki.dprogramming.com/Dfl/Printting">http://wiki.dprogramming.com/Dfl/Printting</a></p><p>DWT的打印写的一般,我添加的就更一般, 以后继续封装,先提供一个可以使用的版本.</p><p>1.<span style="font-family: Arial">PrintDocument 封装了打印机和打印文档,提供打印事件,供打印调用.</span></p><p>2.<span style="font-family: Arial">PrintDialog 打印对话框</span></p><p>3.<span style="font-family: Arial">PrintSetting 打印机设置</span></p><p>4.<span style="font-family: Arial">PrintEventArgs 在打印事件中调用的参数,包含执行具体打印的<span style="font-family: Arial">Graphics.</span></span></p><p>&nbsp;</p><p>NEXT: 提供PrintPreview,PageSetting.</p><p>&nbsp;</p><p>使用方法(Test on DMD1.020,XPsp2):</p><p>1.下载安装DFL <span style="font-family: Arial"><a href="http://www.dprogramming.com/dfl.php">http://www.dprogramming.com/dfl.php</a></span></p><p>2.将<a href="http://www.javaeye.com/topics/download/e5259e77-89ed-4097-8281-fd382b969ab4">打印模块</a>释放到DFL的目录下,覆盖原有的文件(winapi.d,all.d,makelib.bat),重新编译.</p><p>3.用<span style="font-family: Arial">examples目录下的Print.d</span>测试.</p><p>&nbsp;</p><p><span style="font-family: Arial">又修改了，<br />1.让DFL支持中文字体了！ 修改了不支持unicode的windows函数。<br />2.添加了转换函数：GDI仍然使用像素单位，打印自己使用毫米单位。<br /></span></p><div class="dp-highlighter"><p class="alt">&nbsp;</p><ol class="dp-c"><li class="alt"><span>auto&nbsp;f5&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;Font(</span><span class="string">&quot;仿宋_GB2312&quot;</span><span>,&nbsp;14.0F,FontStyle.BOLD,GraphicsUnit.MILLIMETER,GB2312_CHARSET,FontSmoothing.DEFAULT);&nbsp;</span><span class="comment">// </span><span>&nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f6&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;Font(</span><span class="string">&quot;隶书&quot;</span><span>,&nbsp;16.0F,FontStyle.BOLD,GraphicsUnit.MILLIMETER); &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f7&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;Font(</span><span class="string">&quot;宋体&quot;</span><span>,&nbsp;18.0F,FontStyle.BOLD,GraphicsUnit.MILLIMETER); &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f8&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;Font(</span><span class="string">&quot;华文新魏&quot;</span><span>,&nbsp;20.0F,FontStyle.BOLD,GraphicsUnit.MILLIMETER); &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;f9&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;Font(</span><span class="string">&quot;楷体_GB2312&quot;</span><span>,&nbsp;26.0F,FontStyle.BOLD,GraphicsUnit.MILLIMETER); &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;co&nbsp;=&nbsp;Color(0,&nbsp;0,&nbsp;0); &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Graphics&nbsp;gc=&nbsp;pea.graphics; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//prd:&nbsp;A4 </span><span>&nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;x,y,w,h; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;12; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;10; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;=&nbsp;230; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;cast(</span><span class="keyword">int</span><span>)f5.getSize(GraphicsUnit.MILLIMETER);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawText(</span><span class="string">&quot;Hello&nbsp;中文&quot;</span><span>~f5.name(),&nbsp;f5,&nbsp;co,&nbsp;prd.mrTpr(Rect(x,y,&nbsp;w,h))&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;y&nbsp;+&nbsp;h; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;&nbsp;cast(</span><span class="keyword">int</span><span>)f6.getSize(GraphicsUnit.MILLIMETER);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawText(</span><span class="string">&quot;Hello&nbsp;中文&quot;</span><span>~f6.name(),&nbsp;f6,&nbsp;co,&nbsp;prd.mrTpr(Rect(x,y,&nbsp;w,h))&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;y&nbsp;+&nbsp;h; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;&nbsp;cast(</span><span class="keyword">int</span><span>)f7.getSize(GraphicsUnit.MILLIMETER);&nbsp; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawText(</span><span class="string">&quot;Hello&nbsp;中文&quot;</span><span>~f7.name(),&nbsp;f7,&nbsp;co,&nbsp;prd.mrTpr(Rect(x,y,&nbsp;w,h))&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;y&nbsp;+&nbsp;h; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;&nbsp;cast(</span><span class="keyword">int</span><span>)f8.getSize(GraphicsUnit.MILLIMETER);&nbsp; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawText(</span><span class="string">&quot;Hello&nbsp;中文&quot;</span><span>~f8.name(),&nbsp;f8,&nbsp;co,&nbsp;prd.mrTpr(Rect(x,y,&nbsp;w,h))&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;y&nbsp;+&nbsp;h; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;=&nbsp;cast(</span><span class="keyword">int</span><span>)f9.size(); &nbsp;&nbsp;</span> </li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.drawText(</span><span class="string">&quot;Hello&nbsp;中文&quot;</span><span>~f9.name(),&nbsp;f9,&nbsp;co,&nbsp;prd.mrTpr(Rect(x,y,&nbsp;w,h))&nbsp;);&nbsp; &nbsp;&nbsp;</span> </li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pea.HasMorePages&nbsp;=</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span> </li></ol><p class="alt">&nbsp;</p></div><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/117589#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 28 Aug 2007 17:14:00 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/117589</link>
        <guid>http://ideage.javaeye.com/blog/117589</guid>
      </item>
      <item>
        <title>管理故事：乡愿与小人</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/109468" style="color:red;">http://ideage.javaeye.com/blog/109468</a>&nbsp;
          发表时间: 2007年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>中国式管理首重关系管理，而关系管理最大的敌人就是乡愿、小人与派系。派系是结构问题，我们以后再谈，这里先谈乡愿与小人问题。 </p>
<p>&nbsp;</p>
<p>　　唐朝，某一年大丰收，一天唐德宗打猎到一个农民赵光奇的家问他们快不快乐，结果赵光奇向他哭诉陈情，政府不诚不信，说不多立名目课税，却继续收差役代金，说是征粮，却一文钱不给。德宗听得不甚唏嘘，当场就把这家人的税负免了。听起来，德宗十分宽大听得下民间抱怨，但实际上他在位期间，三度丢掉首都长安，安史之乱后唐朝国力大伤，但被德宗一折腾，自此一蹶不振，直到亡国。为什么？因为德宗的表现是乡愿，税是国家大法，应该一体适用，免了这家，再其他家呢？他不思索建立制度使人民休生养息，如果是苛税伤民，就该减所有人的某些税，如果是官吏贪贿，在国税之外多辟财源，他就该好好整顿吏治。德宗只顾做好人，表演亲民秀，却破坏国法，国家治理因而紊乱。 </p>
<p>&nbsp;</p>
<p>　　孔子说：&ldquo;乡愿，德之贼也。&rdquo;乡愿没有原则，不讲法律秩序，只是一味做好人，自己看到的，接触到的人都一味示好，大家都说他好人，都想接近他，但整体的法律制度却会荡然无存，也没有公平公正可言，结果必是使一家人笑，却使一街人哭(受那&ldquo;一家人&rdquo; 欺凌，却又挨不近乡愿身边的人只有哭)。企业领导经常只看到有关系的身边之人，对他有同情心，所以不忍，在乎与他的关系，所以矫情徇私，但这是妇人之仁，绝对会破坏公司内的公平，久之，其他人不平则鸣，公司和谐也将荡然无存。为了维持秩序与原则，该切断关系时要能够壮士断腕，一味的表现恩慈，是乡愿，在管理整个企业的人际和谐上，是有害的。 </p>
<p>&nbsp;</p>
<p>　　公元前五二七年，楚国的楚平王要为自己的儿子娶一门媳妇，选中的姑娘在秦国，于是就派出一名叫费无忌的大夫前去迎娶。费无忌看到姑娘长得极其漂亮，眼睛一转，就开始在半途上动脑筋了。他认为如此漂亮的姑娘应该献给正当权的楚平王。尽管太子娶亲的事已经国人皆知，尽管迎娶的车队已经逼近国都，尽管楚宫里的仪式已经准备妥当，费无忌还是骑了一匹快马抢先直奔王宫，对楚平王描述了秦国姑娘的美丽，说反正太子此刻与这位姑娘尚未见面，大王何不先娶了她，以后再为太子找一门好的呢。楚平王好色，被费无忌说动了心，但又觉得事关国家社稷的形象和承传，必须小心从事，就重重拜托费无忌一手操办。三下两下，这位原想来做太子夫人的姑娘，转眼成了太子的姨娘。说到这里，让我们先停一下，读者试着去想像这个故事会如何发展？君王无礼，小人幸进，结局不容乐观，但历史的发展有时比小说还残忍，这便是一例。 </p>
<p>&nbsp;</p>
<p>　　费无忌办成了这件事，楚平王越来越宠信他了，但静心一想，这件事上受伤害最深的是太子，而太子是迟早会掌大权的，那今后的日子怎么过呢？他开始在楚王耳边递送小语：&ldquo;那件事情之后，太子对我恨之入骨，那倒罢了，我个人也算不得什么，问题是他对大王您也怨恨起来，万望大王戒备。太子已握兵权，外有诸侯支持，内有他的老师伍奢帮着谋划，说不定那一天要兵变呢！&rdquo;楚平王本来就觉得自己对儿子做了亏心事，儿子一定会有所动作，现在听费无忌一说，心想果不出所料，立即下令杀死太子的老师伍奢和其长子伍尚，进而又要捕杀太子，太子和伍奢的次子伍子胥只得逃离楚国。后来伍子胥引来吴国兵马，发誓要为父兄报仇，一再率吴兵伐楚，最后灭了楚国，并对楚平王鞭尸。倒霉的是楚国人民，死伤无数。小人幸进，竟使国家涂炭，民不聊生，令人惊心。 </p>
<p>&nbsp;</p>
<p>　　乡愿与小人不一定是坏人，但一定做人没有原则，做事玩乎法律制度。前者与人为善，不择手段，后者投主所好，亦不择手段。宇文家三兄弟以奸佞取得隋炀帝的信任，并主掌羽林军，最后又杀了炀帝，是隋朝亡国主兕之一。其中三弟宇文士及在隋亡后降于唐太宗。一日，太宗在御园中看到一个树很美，为之赞叹，士及在侧，赶快发挥其佞臣本色，作诗颂词歌颂其树，太宗不高兴的说：&ldquo;我一直听说身旁有奸臣，今日果然看见一个。&rdquo;自此，士及学魏徵，竟成知名谏臣。上有所好，下必从之，士及跟隋炀帝就是佞臣，跟唐太宗就是谏臣，小人投主之所好，可以为善，亦可以为恶。 </p>
<p>&nbsp;</p>
<p>　　乡愿可能有善心，小人不一定有恶念，但往往把是非模糊了，原则不见了，黑白都变成了灰色，对企业内的信任破坏却极大。如之前专栏所述，中国式管理是礼法并治的，礼就是不成文的原则，法就是成文的原则，重法守礼是中国组织治理的首要之道。但乡愿与小人一搅和，有关系则没关系，什么都被允许，于是法律制度颓坏，礼治秩序荡然，公司之内什么原则都不受尊重，人们心中少了那把尺，行为少了制度的约束，最终将很难形成共识，只剩下尔虞我诈，拉党结派，以权相辄，信任将受到彻底破坏。所以说要想在公司内防止乡愿与小人的崛起，公司领导人及整个决策核心精英都要重法守礼，以带动全公司员工守法守礼的文化，阻绝小人幸进之路。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="box2"><span class="Tit">乡愿释义</span></div>
<p>
<table class="htb wr" cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td>
            <div class="box2 p14"><strong>乡愿，指貌似忠厚、实与恶俗同流合污的人。</strong><br />
            <br />
            《论语&middot;阳货》：&ldquo;子曰：&lsquo;<strong>乡愿</strong>，德之贼也。&rsquo;&rdquo; <br />
            <br />
            《论语．子路》：&ldquo;子贡问曰：&lsquo;乡人皆好之，何如？&rsquo;子曰：&lsquo;未可也。&rsquo;&lsquo;乡人皆恶之，何如？&rsquo;子曰：&lsquo;未可也。不如乡人之善者好之，其不善者恶之。&rsquo;&rdquo; <br />
            <br />
            《孟子&middot;尽心下》：&ldquo;言不顾行，行不顾言，则曰：&lsquo;古之人，古之人。行何为踽踽凉凉？生斯世也，为斯世也，善斯可矣。&rsquo;阉然媚于世也者，是<strong>乡原</strong>也。&rdquo;&ldquo;万子曰：&lsquo;一乡皆称原人焉，无所往而不为原人，孔子以为德之贼，何哉？&rsquo;曰：&lsquo;<strong>非之无举也，刺之无刺也，同乎流俗，合乎污世，居之似忠信，行之似廉洁，众皆悦之，自以为是，而不可与入尧舜之道，故曰&ldquo;德之贼&rdquo;也。</strong>孔子曰：&ldquo;恶似而非者：恶莠，恐其乱苗也；恶佞，恐其乱义也；恶利口，恐其乱信也；恶郑声，恐其乱乐也；恶紫，恐其乱硃也；<strong>恶乡原，恐其乱德也</strong>。&rdquo;&rsquo;&rdquo; <br />
            <br />
            徐干《中论&middot;考伪》：&ldquo;<strong>乡愿</strong>亦无杀人之罪也，而仲尼恶之，何也？以其乱德也。&rdquo;<br />
            <br />
            乡愿这个词含义丰富，<a href="http://baike.baidu.com/view/2176.htm" target="_blank">孔子</a>所谓乡愿大概是指伪君子，指那些看似忠厚实际没有一点道德原则，只知道媚俗趋时的人。<a href="http://baike.baidu.com/view/2655.htm" target="_blank">孟子</a>所言大约是说言行不一，当面背后各一套的四方讨好，八面玲珑的人就是乡愿。这种人随波逐流，趋炎媚俗，更多的是指道德败坏的小人。 <br />
            <br />
            孔子判断一个人的德行&ldquo;不以众人的好恶为依据，应以善恶为标准&rdquo;，这个当然是不错的，大是大非的原则问题是万不可妥协的。乡愿所指的伪君子成分定然是众人所唾弃的，所以俗语有伪君子比真小人更可怕，可见人们对这种乡愿的普遍厌恶。</div>
            </td>
        </tr>
    </tbody>
</table>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/109468#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Aug 2007 17:45:54 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/109468</link>
        <guid>http://ideage.javaeye.com/blog/109468</guid>
      </item>
      <item>
        <title>写总结的经验和教训</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/99117" style="color:red;">http://ideage.javaeye.com/blog/99117</a>&nbsp;
          发表时间: 2007年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote dir="ltr" style="MARGIN-RIGHT: 0px">
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为工作的关系，每个人都可能写总结。包括我也不例外。但要写好总结，并在总结会上做好发言却不是容易的事情。下面介绍下我的经验。</h3>
<p><strong><font color="#ff0000">总结的忌讳：</font></strong></p>
<p><strong>1.内容跑题：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说别人的事情多，自己的事情少。总结的中心就是总结自己的工作。或者对工作的建议和思考。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在总结中给大家布置任务，自己不总结。 以大量篇幅告诉大家要怎么做，不说自己做了什么。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给大家讲课，一副教育别人的口吻，并且讲的不是自己研究的东西。</p>
<p><strong>2.流水账：</strong>罗列内容，总是罗列内容，1,2,3,4,就是这些，没有总结。仅仅罗列。没有分析。或者分析的不够深入。</p>
<p><strong>3.假大空：</strong>总结上说了很多原则，政策，对趋势的预测。要不就是工作就是没有完成，客观理由一堆。套话多。</p>
<p><strong>4.演讲中要注意：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>内容脱节：</strong>演示的幻灯片一套，自己说的一套，不搭界。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>闷头自说：</strong>自己光低头看稿子，不抬头，没有表情，我就犯过这个错误。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>零碎太多：</strong>吹话筒，清嗓子，把握不好和麦克风的距离嗡嗡怪叫，不会操作演示软件等。</p>
<p><strong><font color="#ff0000">总结的写法：</font></strong></p>
<p><strong>1.内容要求：</strong></p>
<p><strong><font color="#ff0000">①基本情况：</font><font color="#000000">对工作任务和完成情况进行总结和评价：<font color="#0000ff">说出成绩，反思不足，分享经验</font>，共同提高。应该占的篇幅最多，把三个方便描述清楚。</font></strong></p>
<p><strong><font color="#ff0000">②以后方向：</font><font color="#000000">有了对工作</font><font color="#000000">的问题和分析，提出下一阶段的工作计划：吸取教训，明确方向，提出办法。</font></strong></p>
<p><strong><font color="#ff0000">③其他：</font><font color="#000000">在工作中发现的问题和对问题的思考，对团队的建议，自己的学习情况等。应该占的篇幅最少。</font></strong></p>
<p><strong>2.演讲方式：</strong></p>
<p><strong>写好幻灯片，把内容按照演讲的详略制作成幻灯片，对照幻灯片可用把所有的细节陈述清楚。把握好时间和语气，逐步讲述，不疾不徐，思路清晰，声音洪亮。</strong></p>
<p><strong><font color="#ff0000"></font></strong></p>
<p><strong><font color="#ff0000"></font></strong></p>
</blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://ideage.javaeye.com/blog/99117#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Jul 2007 21:25:14 +0800</pubDate>
        <link>http://ideage.javaeye.com/blog/99117</link>
        <guid>http://ideage.javaeye.com/blog/99117</guid>
      </item>
      <item>
        <title>学习密度与专注力</title>
        <author>ideage</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ideage.javaeye.com">ideage</a>&nbsp;
          链接：<a href="http://ideage.javaeye.com/blog/94622" style="color:red;">http://ideage.javaeye.com/blog/94622</a>&nbsp;
          发表时间: 2007年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          学习密度与专注力<br /><br /> <br /><br />By 刘未鹏(pongba)<br /><br />C++的罗浮宫(http://blog.csdn.net/pongba)<br /><br /> <br /><br />上次学校里面有一个免费的李阳英语讲座，好奇于是就去听了一下。对一句话印象比较深刻，大意是说许多人学了快10年的英语，其开口的时间还不如在集训的七天内开口的时间长。也就是说，尽管学习时间很长，但学习密度极低，结果乘起来还是低。其实这种情况不仅存在于英语学习中，而是一种普遍的现象。人太容易为各种各样的事情分心，要集中注意力做一件事情是非常难的，而正因为难，少有人做到，那些做到的，就都变成了牛。<br /><br /> <br /><br />其实，在大学期间，最不缺的就是业余时间，最缺的就是专注精神，非凡的注意力造就非凡的专家。而生活中太多的分散注意力的因素：游戏、篮球、选修课、女朋友… 要想集中注意力对一个单一的目标猛下功夫，其实还是相当有难度的。这个难度并非来自自制力，如果一个人要靠自制力去强迫自己不受干扰，那只能说还是寻常人(mediocre)。真正的效率源自于内心对一个东西强烈的热忱，也就是我们俗称的追求，这时候从表层意识到深层意识都关注在这件事情上面，脑细胞高度活跃，才能创造最大的效率。为什么作诗的时候要趁着酒兴，就是因为少了这种狂热的专注，效率就低下了，一首诗作个好几天顶多是个平庸之作，跟交家庭作业也差不到哪去了。很多人正是因为缺乏专注，所以虽然也和别人一样过来了大学四年，实质上四年里面利用的时间无形中少了不知多少。<br /><br /> <br /><br />专注力为什么会对学习效率造成这么大的影响。这来源于两个方面，一是专注于一件事情能让表层意识全功率运作，这个是显式的效率。第二点，也是更重要的，它还能够使你的潜意识进入一种专注于这件事情的状态。有过连续几天乃至一周或更长时间思考同一个问题的人想必都有一种感觉，就是在这个思考的期间，有时候虽然表层意识因为种种原因不在思考这个问题了（比如睡觉，比如被其它事情中断），但潜意识层面仍然保留着其“惯性”，也就是说，潜意识层面仍然在做思考的努力，从而虽然表层意识被其它事情占据，但潜意识仍然将时间无形中利用起来了。这种无形中的时间利用日积月累可以产生宏大的效应。关于后一点，著名的例子有我们熟知的那个睡觉中想出苯的化学分子式的老大。非著名的例子有老爸告诉我的两个事情，一是他在20岁左右，组装村子里第一台电视机的时候，装到最后关口，电视机总是不能工作，苦思冥想一整天不得要领，结果睡到半夜突然从梦里醒来，想到了答案，连夜就把电视机装好了。还有一次是妹妹拿一道高中数学题问他，也是想了一天多没答案，结果睡午觉的时候想到了。这些都很好的证明了潜意识能在你觉察不到的情况下产生效率。另一方面，潜意识也能在你觉察不到的情况下干扰你的注意力，我们平常就有这样的经验，一个球迷即使在表层意识专心工作的时候也会不知为何突然想起比赛的事情，一个焦虑某件事情的人即使在做其它事情的时候也会被突然涌上来的焦虑打断。也就是说表层意识在关注一件事情，但潜意识却在关注另一件事情，并且时不时来打扰表层意识，从而影响注意力和效率。所以，如果表层意识和潜意识都能专注同一件事情，也就是俗称的完全投入，这个时候的效率就能double。此外这种专注成了一种习惯之后，就容易在很短时间之内把自己的潜意识带入到一种关注的“惯性”中，于是即便表层意识的注意力已经移开了，然而潜意识仍在继续关注原来的问题。比如你可能有这样的经历，学习一首歌曲，一开始的时候并没有完全学会，然后你就去忙别的事情了，一个星期之后想起这首歌曲，居然发现原来难学会的几个地方突然会哼了；或者思考一个问题，一开始的时候总有一个地方没有思考出来，然后你就先放着了，几天之后回想这个问题，突然发现一切都清晰了。这就是潜意识的效率，它能在你不知不觉中把时间利用起来。<br /><br /> <br /><br />了解专注力的作用不够，如何获得专注力才是更重要的问题。跟人身上的其它特质（性格、心态…）一样，专注力也是一种习惯。一个习惯于专注事情的人不管做什么事情都容易并迅速进入一种专注的状态。既然是一种习惯，就能够培养，金出武雄在《像外行一样思考，像专家一样实践——科研成功之道》里面提到“思维体力”的概念，所谓思维体力就是能够持续集中注意力的时间，注意力造就非凡专家，天才来源于长期的专注的训练。培养你的思维体力，是成为非凡专家的一个必要条件。除了培养专注的习惯之外，还可以通过另一个充分条件来实现专注力，即做自己喜欢做的事。我们从小对自己喜欢做的事情都是极其专注的，当然，即使长大了之后，仍然还是某种程度上保留了这种专注的能力，只不过因为种种外界因素，长久专注的能力反而削弱了，要考虑房子，要考虑业绩，要考虑小孩，要考虑医疗保险…这些让人焦虑的事情会积压在潜意识当中，总是在影响你专注做事，削弱你人生的效率。卡耐基用一整本《人性的优点》来介绍如何克服焦虑，可见焦虑的负面影响有多大。要使自己能像小的时候一样对喜欢的事情投入最大的专注，除了克服焦虑的负面影响之外，还有另一个条件就是不能放弃，今年的奥斯卡独立电影《阳光小美女》上，Frank和Dwayne在码头的那场Loser对话，以及Richard决定把他老爸的遗体带走时说的：“世界上有两种人，赢家和失败者，两者的区别在于，赢家从不放弃…”。佛家说逆境是增上缘，课本说天降降大任于斯人必先苦其心智劳其筋骨…宗教里说经受磨难才能到达彼岸，说的都是同样的道理。不过我还是更欣赏Frank在码头说的那段话（摘自卓别灵的blog）：<br /><br /> <br /><br />“(普鲁斯特)是个法国作家。彻底的失败者。一生没工作，情事不断还是个同性恋。花20年写了一本没几个人看的小说。但他也许是莎士比亚之后最伟大的作家。晚年回首人生，他发现那些难熬的日子才是一生中最好的时光，因为那些日子造就了他。而快活的日子全是浪费时间，没有任何收获。你想一觉醒来就到18岁，觉得这样可以跳过高中时期的痛苦。但高中是你一生中最重要的苦难时光，你不可能经历比这更好的苦难了。”<br /><br /> <br /><br />多好的心态啊。什么是黄金心态，这就是。其实过来人你我都有这样的体会。此外，如何不让生活中其它细节干扰也是一个重要的因素，除了那些你焦虑的事情之外，还有诸如收拾衣服、打扫房间、清理书桌、接孩子回家、瑜伽等等；对此史蒂芬柯维在《高效能人士的七个习惯》里面提到的第四代时间管理法则，即要事第一（指重要但不紧迫的事，即长远积累会对你今后人生产生重大影响的事）