??xml version="1.0" encoding="utf-8" standalone="yes"?>伊色综合久久之综合久久,狠狠色丁香婷婷久久综合五月,一级做a爰片久久毛片看看http://www.shnenglu.com/Fox/游戏人生 != ( 人生 == 游戏 ) <br /> 站点q移臻I<a >http://www.yulefox.com</a>。请订阅本博的朋友将RSS修改?lt;a >http://feeds.feedburner.com/yulefox</a>zh-cnTue, 06 May 2025 23:32:26 GMTTue, 06 May 2025 23:32:26 GMT60automake使用记http://www.shnenglu.com/Fox/archive/2010/01/07/105053.htmlFoxFoxWed, 06 Jan 2010 17:32:00 GMThttp://www.shnenglu.com/Fox/archive/2010/01/07/105053.htmlhttp://www.shnenglu.com/Fox/comments/105053.htmlhttp://www.shnenglu.com/Fox/archive/2010/01/07/105053.html#Feedback4http://www.shnenglu.com/Fox/comments/commentRss/105053.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/105053.html本文同步?a mce_ target="_blank">游戏人生

最q有点忙Q本来要用autoconf+automake把自q代码梳理一下的Q因为工作停了近两周?/p>

本想看看有什么工具可以自动生成Makefile.amQ答案是Q?a mce_ target="_blank">Automake不支持通配W,而且q口口声壎ͼ振振有词。既然说的这么言词凿凿,情深意切Q我x也没有必要用shell生成Makefile.am了?/p>

用着用着Q我有点怀疑h生了Q不知道什么时候需要用autoconf和automake。如果我只是qx自己写一些toy codes的话Q感觉用autoconf和automake有点大炮打蚊子的感觉Q而且每次新加代码或者是U除代码、甚x更改目录Q都要重新执? autoconf、automakeQ不知道我说的对与不对)。对于一个大型项目,执行一ơconfigure和make是很痛苦的一件事Qmake的中 间目标文件或者库文g、执行文件倒是不一定非得完全rebuildQconfigure的配|检查呢Q是不是也有cM机制Q反正我在用ogre或? cegui的时候,每次执行./configure是重新配|了的?/p>

实际在开源项目里面也不可能维护两套makefile吧?/p>

看了一?a mce_ target="_blank">googletest的配|,倒是清爽的很Q最大的特点是只有一个Makefile.amQ这样在一个项目里面只需要维护一个Makefile.am够了?/p>

cegui比较常规Q每个子目录都会l护一个Makefile.am?/p>

需要特别注意的是ogre?a mce_ target="_blank">1.7.0开始已l开始?a mce_ target="_blank">cmake?#8230;…

请听题:理中小型项目,你們֐于下面哪个工P

o makeQ钻木取火,玩的是个技术,~译代码Q只用装B的,不用牛B的,你要是用什么cmakeQ你都不好意思跟别h打招|q么l典的东西,_N需要多久?要我说怎么着也得个把俩月吧,个把俩月Q那是入门,臛_半年Q就q还得有Feldman的?zhn)性,不舍昼夜Q?/p>

o autoconf+automakeQ既有群众基Q又有技术含量,你是那样拉蘪的男人,不管在什么地方,好像漆黑中的萤火虫一P那样的鲜明,那样? Z。你那忧郁的眼神Q稀嘘的胡喳子,乎其技的指法;既可以ȝ原始人的生力低下,q可以鄙视现代h的不学无术?/p>

o cmakeQ在MSVCers面前抬不起头Q在UNIXers面前g更抬不v_而cmake对WINDOWS和UNIXq_的完支持,以让所有的 MSVCers和UNIXer在你面前抬不起头Q你是公鸡中的战斗机。所以你q是可以N气昂的丢下一句:走NB的\Q让SB说去吧?/p>




Fox 2010-01-07 01:32 发表评论
]]>
Autotools初体?/title><link>http://www.shnenglu.com/Fox/archive/2009/12/23/autotools_first_use.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Tue, 22 Dec 2009 18:18:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2009/12/23/autotools_first_use.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/103743.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2009/12/23/autotools_first_use.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/103743.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/103743.html</trackback:ping><description><![CDATA[     摘要: 从接触和使用make以来Q前前后后写了不MakefileQ添d减、修修补补,累计上千行是有的Q,今天在重新整理代码的l织l构之后Q突然就惻I我ؓ什么不使用Autotools呢? <br> <br>在开始体验功能强大的Autotools之前Q简单(详细Q回忆ȝ一下我使用make的经历和思考的q程Q反省一下看看自己在接触q些新鲜事物的时候到底走了多弯路?nbsp; <a href='http://www.shnenglu.com/Fox/archive/2009/12/23/autotools_first_use.html'>阅读全文</a><img src ="http://www.shnenglu.com/Fox/aggbug/103743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2009-12-23 02:18 <a href="http://www.shnenglu.com/Fox/archive/2009/12/23/autotools_first_use.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UUID法分析http://www.shnenglu.com/Fox/archive/2009/12/06/uuid_algorithm_analysis.htmlFoxFoxSun, 06 Dec 2009 07:07:00 GMThttp://www.shnenglu.com/Fox/archive/2009/12/06/uuid_algorithm_analysis.htmlhttp://www.shnenglu.com/Fox/comments/102647.htmlhttp://www.shnenglu.com/Fox/archive/2009/12/06/uuid_algorithm_analysis.html#Feedback2http://www.shnenglu.com/Fox/comments/commentRss/102647.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/102647.html游戏人生

Writen by Fox(yulefox.at.gmail.com)

在具体讨Z前,本文先厘清UUIDQUniversally Unique IDentifierQ与GUIDQGlobally Unique IDentifierQ的关系?/p>

在分布式、网l、单机环境下Qؓ了能够用具有某UŞ式的ID唯一标识pȝ中的M元素Q这LID可以不依赖中心认证自动生成,于是UUIDp生了?/p>

UUID标准的历史沿革和具体实现?a title="RFC4122" target="_blank">RFC 4122?a title="ITU-T rec. x.667" target="_blank">ITU-T Rec. X.667?a title="ISO/IEC 9834-8:2008" target="_blank">ISO/IEC 9834-8:2008中均有详l描q。ITU和ISO采用的标准和RFC 4122都是在UUID的早期版本基上完成,各版本之间具有一致性和兼容性?/p>

因ؓ不能保证UUID的唯一性,ITU和ISO针对UUID的用都?a id="eac3" title="免责声明" target="_blank">免责声明?/p>

GUID一般是指Microsoft对于UUID标准的实玎ͼUUID的实现则多见于其他系l(*NIX、MAC OS{)中。在了解了这一区别后,本文统一使用UUID来指代对应的原理、算法及实现?/p>

文中关于UUID的讨论全部基于RFC 4122和ITU-T Rec. X.667以及OSF、IETF、ITUQT、ISO、FIPS的各U标准文档。而UUID的细节(如结构、表C、算法、实现等Q均以ITU-T Rec. X667为唯一蓝本Q文?#8220;本标?#8221;x代该蓝本?/p>

o 介绍

UUID是长度ؓ16-byteQ?28-bitQ的IDQ一般以形如f81d4fae-7dec-11d0-a765-00a0c91e6bf6的字W串作ؓURNQUniform Resource NameQ统一资源名称Q?/p>

o 动机

无须中心认证Q自动生成,支持一台机器每U生?0Mơ(100U秒U,光含原因是指能够区分的最时间单位ؓ100nsQ将旉作ؓ因子Ӟq箋生成两个UUID的时间至要间隔100nsQ。方便存取、分配、排序、查找?/p>

o l构


   76543210765432107654321076543210
   + – - – = – - – = – - – = – - – +
15 |            TimeLow            | 12
11 |    TimeMid    |   Version..   |  8
7  |Vari.. |Clock..|     Node      |  4
3  |             Node              |  0
   + – - – = – - – = – - – = – - – +
15 – 12: TimeLow 旉值的低位
11 – 10: TimeMid 旉值的中位
09 – 08: VersionAndTimeHigh 4位版本号和时间值的高位
07: VariantAndClockSeqHigh 2位变体(ITU-TQ和旉序列高位
06: ClockSeqLow 旉序列低位
05 – 00: Node l点
hexOctet = hexDigit hexDigit
hexDigit =
“0″ / “1″ / “2″ / “3″ / “4″ / “5″ / “6″ / “7″ / “8″ / “9″ /
“a” / “b” / “c” / “d” / “e” / “f” /
“A” / “B” / “C” / “D” / “E” / “F”
UUID =
TimeLow
“-” TimeMid
“-” VersionAndTimeHigh
“-” VariantAndClockSeqHigh ClockSeqLow
“-” Node

UUID׃q?个域构成Q每个域~码q字节,q以16q制数表C128位的UUIDQ相d以减?#8220;-”分隔 QVariantAndClockSeqHigh和ClockSeqLow对应的两个字节例外,如上所C)。该l构中包含版本(VersionQ、变? QVariantQ、时_TimeQ、时钟序列(Clock SequenceQ、节点(NoteQ信息(以无W号整型DC)?/p>

o 合法?/strong>

除判断variant位设|是否正、基于时间生成的UUID旉值是否ؓ未经分配的将来时间外Q实际应用中没有其他机制可以判定UUID是否合法?/p>

o 变体

Variant位是UUIDW?字节QVariantAndClockSeqHighQ的最?位,

7 6 5  Description
0 – –  NCS向后兼容
1 0 –  本标?br> 1 1 0  Microsoft向后兼容
1 1 1  ITU-T Rec. X.667保留

o 版本

UUID的生成有旉、名U、随机数三种{略Q以W?字节QVersionAndTimeHighQ的最?位表C?/p>

目前UUID定义?个版本:

7 6 5 4  Ver  Description
0 0 0 1  1    Z旉的版本(本标准)
0 0 0 0  2    使用嵌入式POSIXQDCE安全版本Q?br> 0 0 1 1  3    使用MD5哈希的基于名U的版本Q本标准Q?br> 0 1 0 0  4    Z随机数的版本Q本标准Q?br> 0 1 0 1  5    使用SHA-1的基于名U的版本Q本标准Q?/p>

o 旉

旉是一?0位的整型|?位版本号外的?字节Q,对应UTCQ格林尼L?582q?0?5日午夜始Q的100ns旉间隔计数?/p>

对于ver 4?Q该值分别对应一个随机数和一个全局唯一的名U?/p>

o 旉序列

对基于时间的UUID版本Q时间序列用于避免因旉向后讄或节点值改变可能造成的UUID重复Q对Z名称或随机数的版本同h用:目的都是Z防止UUID重复?/p>

如果前一旉序列已知Q通过自增实现旉序列值的改变Q否则,通过密码学(伪)随机数设|新的时钟序列倹{?/p>

o 节点

对基于时间的UUID版本Q节点由48位的单播MAC地址构成。对于没有MAC地址的系l,节点gؓ一个密码学Q伪Q随机数Qؓ防止与MAC地址发生撞Q需讄多播位)?/p>


o Z旉的UUID生成法

o 定UTC旉Q?0?TimeQ和旉序列|14?ClockSequenceQ;

o 讄TimeLowQ对应Time?1-0位)Q?/p>

o 讄TimeMidQ对应Time?7-32位)Q?/p>

o 讄VersionAndTimeHighQ?位版本号及Time?9-48位)Q?/p>

o 讄VariantAndClockSeqHighQ变体位及对应ClockSequence?3-8位)Q?/p>

o 讄ClockSeqLowQ对应ClockSequence?-0位)Q?/p>

o 讄NodeQ对?8位MAC地址Q?/p>

o Z名称的UUID生成法

o 针对相应的命名空_如DNS、URL、OID{)分配一个UUID作ؓ所有UUID的命名空间标识;

o 名U{换ؓ字节数列Q?/p>

o 使用MD5或SHA-1法对与名称兌的命名空间标识进行计,产生16字节哈希l果Q?/p>

o 讄TimeLowQ对应哈希值的3-0字节Q;

o 讄TimeMidQ对应哈希值的5-4字节Q;

o 讄VersionAndTimeHighQ对应哈希值的7-6字节Q,以相应版本号重写对应位(W?字节的高4位)Q?/p>

o 讄VariantAndClockSeqHighQ对应哈希值的W?字节Q,重写变体对应位(W?字节的高2位,本标准对应gؓ10Q;

o 讄ClockSeqLowQ对应哈希值的W?字节Q;

o 讄NodeQ对应哈希值的15-10字节Q?/p>

? 于MD5撞问题QMD5只用于向后兼容的UUID生成Q不再被推荐使用。由于SHA-1哈希l果?60位(20字节Q,本算法中Q需要将FIPS PUB 180-2中的SHA-1法的哈希值字节顺序反转(字节内顺序不变)QUUID使用?5-0字节Q?9-16字节被丢弃?/p>

o Z随机数的UUID生成法

o 讄VariantAndClockSeqHigh的变体位gؓ10Q?/p>

o 讄VersionAndTimeHigh?位版本号Q?/p>

o 讄剩余位ؓ随机倹{?/p>

本文中讨论的密码学随机数Q主要根据系l可以提供的信息Q内存、硬盘、句柄、程序运行的U程、进E、句柄、堆栈等Q,利用SHA-1{哈希算法得到?/p>

其他关于密码学随机数的描qͼ我曾?a id="dtto" title="h密码学意义的PRNGQCSPRNGQ? target="_blank">q篇文章中简单提到?/p>


具体法实现可以参考文档和开源代码?


Fox 2009-12-06 15:07 发表评论
]]>
ACE vs Boost: Singleton的实?/title><link>http://www.shnenglu.com/Fox/archive/2009/09/22/96898.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Mon, 21 Sep 2009 16:38:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2009/09/22/96898.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/96898.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2009/09/22/96898.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/96898.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/96898.html</trackback:ping><description><![CDATA[<p>本文同步?a target="_blank">游戏人生</a> <p>以前曄讨论q?a target="_blank">Singleton的实?/a>Q这ơ在对照ACE和Boost代码的时候,又重新审视了一下二者对Singleton不同的实现。其间的差别也体C不同的编E哲学:ACE的实现更加偏重多U程中的安全和效率问题;Boost的实现则偏重于用语a自n的特性满Singleton模式的基本需求? <p><strong>o ACE的实?/strong> <p>Douglas C. Schmidt?a target="_blank">Double-Checked Locking: An Optimization Pattern for Efficiently Initializing and Accessing Thread-safe Objects</a>一文中对double-check lockQ一般译为双锁)q行了详l的阐述? <p>ACE的Singleton使用Adapter模式实现对其他类的适配Q之具有全局唯一的实例。由于C++标准q明确指定全局静态对象的初始化顺序,ACE使用double-check lock保证U程安全Qƈ使之不受全局静态对象初始化序的媄响,同时也避免了全局静态实现方式的初始化后不用的开销? <p>如果你能够准的区分以下三种实现的弊端和隐?zhn)Q对double-check lock也就有了_的了解? <blockquote><code> <p>// -------------------------------------------<br>class Singleton<br>{<br>public:<br>    static Singleton *instance (void)<br>    {<br>        // Constructor of guard acquires<br>        // lock_ automatically.<br>        Guard<Mutex> guard (lock_);<br>        // Only one thread in the<br>        // critical section at a time.<br>        if (instance_ == 0)<br>            instance_ = new Singleton;<br>        return instance_;<br>        // Destructor of guard releases<br>        // lock_ automatically.<br>    }<br>private:<br>    static Mutex lock_;<br>    static Singleton *instance_;<br>}; <p>// ---------------------------------------------<br>static Singleton *instance (void)<br>{<br>    if (instance_ == 0) {<br>        Guard<Mutex> guard (lock_);<br>        // Only come here if instance_<br>        // hasn’t been initialized yet.<br>        instance_ = new Singleton;<br>    }<br>    return instance_;<br>} <p>// ---------------------------------------------<br>class Singleton<br>{<br>public:<br>    static Singleton *instance (void)<br>    {<br>        // First check<br>        if (instance_ == 0)<br>        {<br>            // Ensure serialization (guard<br>            // constructor acquires lock_).<br>            Guard<Mutex> guard (lock_);<br>            // Double check.<br>            if (instance_ == 0)<br>                instance_ = new Singleton;<br>        }<br>        return instance_;<br>        // guard destructor releases lock_.<br>    }<br>private:<br>    static Mutex lock_;<br>    static Singleton *instance_;<br>};</p></code></blockquote> <p>更多详情Q见Schmidt老师的原文和ACE_Singleton实现? <p><strong>o Boost的实?/strong> <p>Boost的Singleton也是U程安全的,而且没有使用锁机制。当ӞBoost的Singleton有以下限Ӟ遵从q些限制Q可以提高效率)Q? <p>o The classes below support usage of singletons, including use in program startup/shutdown code, AS LONG AS there is only one thread running before main() begins, and only one thread running after main() exits. <p>o This class is also limited in that it can only provide singleton usage for classes with default constructors. <blockquote><code> <p>// T must be: no-throw default constructible and no-throw destructible<br>template <typename T><br>struct singleton_default<br>{<br>private:<br>    struct object_creator<br>    {<br>        // This constructor does nothing more than ensure that instance()<br>        //  is called before main() begins, thus creating the static<br>        //  T object before multithreading race issues can come up.<br>        object_creator() { singleton_default<T>::instance(); }<br>        inline void do_nothing() const { }<br>    };<br>    static object_creator create_object; <p>    singleton_default(); <p>public:<br>    typedef T object_type; <p>    // If, at any point (in user code), singleton_default<T>::instance()<br>    //  is called, then the following function is instantiated.<br>    static object_type & instance()<br>    {<br>        // This is the object that we return a reference to.<br>        // It is guaranteed to be created before main() begins because of<br>        //  the next line.<br>      static object_type obj; <p>      // The following line does nothing else than force the instantiation<br>      //  of singleton_default<T>::create_object, whose constructor is<br>      //  called before main() begins.<br>      create_object.do_nothing(); <p>      return obj;<br>    }<br>};<br>template <typename T><br>typename singleton_default<T>::object_creator<br>singleton_default<T>::create_object;</p></code></blockquote> <p>对于多数Singleton使用QBoost提供的版本完全能够满需求。ؓ了效率,我们有必要对其用作Z定的限制?/p> <p>而在多线E编E中Q则有必要用double-check lock降低频繁加锁带来的开销?/p> <p>-------------------------------------------------------------------------------</p> <p>PS: ƣ赏Soft的一句话Q?strong>l得赯惑,耐得住寂?/strong>?/p><img src ="http://www.shnenglu.com/Fox/aggbug/96898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2009-09-22 00:38 <a href="http://www.shnenglu.com/Fox/archive/2009/09/22/96898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOCP使用时常见的几个错误http://www.shnenglu.com/Fox/archive/2009/09/12/95975.htmlFoxFoxFri, 11 Sep 2009 16:20:00 GMThttp://www.shnenglu.com/Fox/archive/2009/09/12/95975.htmlhttp://www.shnenglu.com/Fox/comments/95975.htmlhttp://www.shnenglu.com/Fox/archive/2009/09/12/95975.html#Feedback9http://www.shnenglu.com/Fox/comments/commentRss/95975.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/95975.html本文同步?a target="_blank">游戏人生

在用IOCPӞ最重要的几个API是GetQueueCompeltionStatus、WSARecv、WSASendQ数据的I/O及其完成状态通过q几个接口获取ƈq行后箋处理?/p>

GetQueueCompeltionStatus attempts to dequeue an I/O completion packet from the specified I/O completion port. If there is no completion packet queued, the function waits for a pending I/O operation associated with the completion port to complete.

BOOL WINAPI GetQueuedCompletionStatus(
  __in   HANDLE CompletionPort,
  __out  LPDWORD lpNumberOfBytes,
  __out  PULONG_PTR lpCompletionKey,
  __out  LPOVERLAPPED *lpOverlapped,
  __in   DWORD dwMilliseconds
);

If the function dequeues a completion packet for a successful I/O operation from the completion port, the return value is nonzero. The function stores information in the variables pointed to by the lpNumberOfBytes, lpCompletionKey, and lpOverlapped parameters.

除了兛_q个API的in & outQ这是MSDN开头的几行可以告诉我们的Q之外,我们更加兛_不同的return & out意味着什么,因ؓ׃各种已知或未知的原因Q我们的E序q不L有正的return & out?/p>

If *lpOverlapped is NULL and the function does not dequeue a completion packet from the completion port, the return value is zero. The function does not store information in the variables pointed to by the lpNumberOfBytes and lpCompletionKey parameters. To get extended error information, call GetLastError. If the function did not dequeue a completion packet because the wait timed out, GetLastError returns WAIT_TIMEOUT.

假设我们指定dwMilliseconds为INFINITE?/p>

q里常见的几个错误有Q?/p>

WSA_OPERATION_ABORTED (995): Overlapped operation aborted.

׃U程退出或应用E序hQ已攑ּI/O 操作?/p>

MSDN: An overlapped operation was canceled due to the closure of the socket, or the execution of the SIO_FLUSH command in WSAIoctl. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.

成因分析Q这个错误一般是׃peer socket?strong>closesocket或?strong>WSACleanup关闭后,针对q些socket的pending overlapped I/O operation被中止?/p>

解决Ҏ(gu)Q针对socketQ一般应该先调用shutdown止I/O操作后再调用closesocket关闭?/p>

严重E度Q?strong>d易处?/strong>?/p>

WSAENOTSOCK (10038): Socket operation on nonsocket.

MSDN: An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.

成因分析Q在一个非套接字上试了一个操作?/p>

使用closesocket关闭socket之后Q针对该invalid socket的Q何操作都会获得该错误?/p>

解决Ҏ(gu)Q如果是多线E存在对同一socket的操作,要保证对socket的I/O操作逻辑上的序Q做好socket的graceful disconnect?/p>

严重E度Q?strong>d易处?/strong>?/p>

WSAECONNRESET (10054): Connection reset by peer.

q程L关闭了一个现有的q接?/p>

MSDN: An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.

成因分析Q在使用WSAAccpet、WSARecv、WSASend{接口时Q如果peer applicationH然中止Q原因如上所qͼQ往其对应的socket上投递的operations会p|?/p>

解决Ҏ(gu)Q如果是Ҏ(gu)L或程序意外中止,那就只有各安天命了。但如果q程序是你写的,而你只是hard closeQ那q不得别h了。至,你要知道q样的错误已l出CQ就不要再费劲的l箋投递或{待了?/p>

严重E度Q?strong>d易处?/strong>?/p>

WSAECONNREFUSED (10061): Connection refused.

׃目标机器U极拒绝Q无法连接?/p>

MSDN: No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host—that is, one with no server application running.

成因分析Q在使用connect或WSAConnectӞ服务器没有运行或者服务器的监听队列已满;在用WSAAcceptӞ客户端的q接h被condition function拒绝?/p>

解决Ҏ(gu)QCall connect or WSAConnect again for the same socket. {待服务器开启、监听空闲或查看被拒l的原因?strong>是不是长的丑或者钱没给够,要不是服务器拒l接受天仯酬自d业去了?

严重E度Q?strong>d易处?/strong>?/p>

WSAENOBUFS (10055): No buffer space available.

׃pȝ~冲区空间不x列队已满Q不能执行套接字上的操作?/p>

MSDN: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

成因分析Q这个错误是我查看错误日志后Q最在意的一个错误。因为服务器对于消息收发有明限Ӟ如果~冲Z_该早处理了Q不可能待到send/recvp|啊。而且q个错误在之前的版本中几乎没有出现过。这也是q篇文章的主要内宏V像connect和accept因ؓ~冲区空间不都可以理解Q而且危险不高Q但如果send/recv造成拥堵q恶性@环下去,ȝ大了,臛_说明之前的验证逻辑有疏漏?/p>

WSASendp|的原因是QThe Windows Sockets provider reports a buffer deadlock. q里提到的是buffer deadlockQ显然是׃多线EI/O投递不当引L?/p>

解决Ҏ(gu)Q在消息收发前,Ҏ(gu)大挂L消息ȝ数量和容量进行检验和控制?/p>

严重E度Q?strong>严重?/p>

本文主要参?a target="_blank">MSDN?/p>

************* 说明 *************

Fox只是对自己关心的几个错误和API参照MSDNq行分析Q不提供额外帮助?/p>

Fox 2009-09-12 00:20 发表评论
]]>Amdahl 定律 = Gustafson定律http://www.shnenglu.com/Fox/archive/2009/09/10/95782.htmlFoxFoxThu, 10 Sep 2009 04:04:00 GMThttp://www.shnenglu.com/Fox/archive/2009/09/10/95782.htmlhttp://www.shnenglu.com/Fox/comments/95782.htmlhttp://www.shnenglu.com/Fox/archive/2009/09/10/95782.html#Feedback0http://www.shnenglu.com/Fox/comments/commentRss/95782.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/95782.html本文同步?a target="_blank">游戏人生

周伟明老师应该是多核计领域的老h了?/p>

q几日因为想找找无锁Qlock-freeQ方面的信息Q就打开?a target="_blank">周老师的blog。看?a target="_blank">多核pȝ中三U典型锁竞争的加速比分析q篇文章Ӟ觉得老师多核计算效率是有必要的,但拿Amdahl 定律和Gustafson定律作对比有点不恰当?/p>

按照我的理解Q这两个定律所ȝ的内Ҏ(gu)完全一致的Q只是对加速比的定义不一LŞ了。这里,我们都以S(n)表示n核系l对具体E序的加速比QK表示串行部分计算旉比例?/p>

Amdahl 定律的加速比QS(n) Q?使用1个处理器的串行计时?/ 使用n个处理器的ƈ行计时?/p>

S(n) = 1/(K+(1-K)/n) = n/(1+(n-1)K)

Gustafson定律的加速比QS(n) Q?使用n个处理器的ƈ行计量 / 使用1个处理器的串行计量

S(n) = K+(1-K)n

通俗的讲QAmdahl 定律工作量看作1Q有n怹只能分担1-K的工作量Q而Gustafson定律则将单核工作量看?Q有n核,可以增加n(1-K)的工作量?/p>

q两个计公式都没有锁开销考虑在内Q是理想化的。周老师提到设计不当造成q行变串行的问题与这两个公式计算无关。因ZQ何多核计都存在对串行和q行的设计考量Q这正是E序员在使用多核q行时最兛_的事情?/p>

MQ二者的区别只在于态度的不同:一个消极?zhn)观,一个积极乐观,充其量是一个冷W话Q而于多核计算没有M兌?/p>

我说q些也与多核计算没有兌Q丝毫没有质疑多核效率的意思。相反,我期待能够通过技术层面提高多核的有效负蝲?/p>最后一句题外话Q周老师使用Word的水q一般:所有来自Word的截N是在面视图直接截,换行W和光标随处可见?img src ="http://www.shnenglu.com/Fox/aggbug/95782.html" width = "1" height = "1" />

Fox 2009-09-10 12:04 发表评论
]]>
ACE: Socket装Q?1Q?/title><link>http://www.shnenglu.com/Fox/archive/2009/09/01/94973.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Tue, 01 Sep 2009 06:22:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2009/09/01/94973.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/94973.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2009/09/01/94973.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/94973.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/94973.html</trackback:ping><description><![CDATA[<p>本文同步?a target="_blank">游戏人生</a></p> <p><strong>o *__ ?__* o</strong></p> <p>在阅读ACE代码和C++NPv1, v2, APG的时候,我意识到一个问题:虽然E有C++和网l基的同学都可以LACEQ但如果你对OSQ五大管理模块都包含在内Q、TCP/IP、C++、Design Patterns了解多Q你p能体会ACEZ么需要这么庞杂,虽然它不够完(但至我q没有资格来批评q一点,我现在最常想做的一个动作就是五体投圎ͼ?/p> <p>而且我隐U感觉到Q我现在所写的很多东西在以后(对于有些人或许就是现在)看来会相当不深刻、相当不严}Q但对于一D学习历E,q个q程是必然的、必需的?/p> <p>在C++NPv1中,<a target="_blank">Douglas C. Schmidt</a>把原始socket及其API的缺h些妖化了,比如一D加上注释、空行在内的35行的代码Q被指出?0处错误之多。这像很多其他语言的倡导者或反传lC/C++指针者在批评指针时的说法一栗长期用原始socket和指针的同学Ҏ(gu)感觉很不舒服Q何况socket API提供了大量错误检的接口Q至多是不够友好|了。你好就好了Q没必要抓住别h一痛批吧Q『本是同根生Q相煎何太急』?/p> <p>虽然Solaris、Linux的很多版本及Windows对v源于Berkeley的socket APIq行了重写,但不可否认,׃历史原因和POSIX标准的存在,对于使用者而言Q我们可以无视这些API的实现差异。只是一旦我们从socket通信扩展到其他IPC通信的话Q就需要正视各UI/Ol节的差异了?/p> <p>׃UNIX中,对于socket, file, pipe, device的大多数操作Q描q符都是通用的(q一点,OS上面讲的更清楚些Q。而Windows中,句柄大多不能互换Qsocket对于MS来说是舶来品Q。系l和标准的不一致导致地址、协议和API的؜杂甚x؜乱?/p> <p>UNIX下的描述W和Windows的句柄可以看作是同一个概念,只是应用环境不一P所描述的内容也时常不一P再简单了_它们都是一个整型的ID?/p> <p>ACE的源码中使用了大量预处理指oQ尤其在跨^?~译环境的部分更加明显。鉴于C/C++标准的博大胸怀Q有些指令需要阅ȝ关编译器提供的帮助文档:</p> <p>o #pragma: <a target="_blank">GCC</a>, <a target="_blank">MSVC</a></p> <p>o #define (#, #@, ##) : <a target="_blank">GCC</a>, <a target="_blank">MSVC</a> </p> <p>其中有若q代码文件以.inl为后~Q里面是寚w分函数的内联实现Q以使代码结构看上去更加z。如果确定用内联函数的话,*.inl被包含?.h的最后,如果不用,则像*.h一P包含?.cpp的头部?/p> <p>ACE采用doxygen输出文档Q在阅读代码注释时能够感受到差异Q但基本不会影响阅读?/p> <p><strong>o * __ 关于W?章(C++NPv1Q__ * o</strong></p> <p>ACE抽象的地址cACE_Addr拥有ACE_DEV_Addr, ACE_FILE_Addr, ACE_INET_Addr, ACE_SPIPE_Addr, ACE_UNIX_Addr五个子类。对于狭义上的网l通信QTCP/IPQ而言QACE_INET_Addr对应于我们熟(zhn)的sockaddr_in?/p> <p>ACE_IPC_SAP是IPCQinterprocess communicationQI/O操作cȝrootcR?/p> <p>从编码的角度看,q个cL亮的地方在于CZ了抽象类的另一U实现方式?/p> <p>一提到抽象c,大多Ch的第一反应是pure virtual function。当一个基cȝ定需要用virtual functionӞq是一个不错的选择。但我们都知道虚拟函数有开销。而且对于一个结构简单的抽象基类和其l承子类Q尤其是大量使用ӞQ一个虚函数表带来的开销会让整个设计昑־十分y脚?/p> <p>我们都知道如何强制让一个类无法使用default constructorQprotectedQ。如果对基类使用该方法,仅子类hpublic的default constructorQ这pC定义抽象基类的效果?/p> <p>virtual destructor的意义在于防止delete父类指针Q指向子cd象)时未调用子类destructor。在此例中,为避免这U情况,同样destructor声明为protected卛_?/p> <p>从设计实现的角度看,相较于socket APIQACE_IPC_SAP的子cACE_SOCK提供了编译时对句柄合法性的?/p> <p>从逻辑功能层面划分Qsocket有三U角Ԍ</p> <p>o active connection role (connector)Q主动连?/p> <p>o passive connection role (acceptor)Q被动连?/p> <p>o communication role (stream)Q数据通信</p> <p>但socket API毕竟不是OOD出来的,对于一个socket描述W,也完全没有必要去限制其担负的功能Q更不可能搞成三U不同的socket。而OOD的ACE则可以轻易实现对socket对象及其操作的封装?/p> <p>工厂cACE_SOCK_Connector是一个主动创建通信端的工厂cRsocket API中的connect接口只是Z个socket建立与其它peer的网l连接,而不产生新的socket实例Q也不依赖于M其它socket。同PACE_SOCK_Connector只是Z个ACE_SOCK_Stream对象Q对用于数据通信的socket的封装)q接到ACE_AddrQ对struct sockaddr的封装)提供接口Q也不含对ACE_SOCK_Stream对象的其它操作?/p> <p>工厂cACE_SOCK_Acceptor是一个被动创建通信端的工厂cR当监听到新的网l连接后Qؓ该连接初始化一个ACE_SOCK_Stream对象。和connector不同的是Qacceptor依赖于一个已l存在的充当监听功能的socket句柄QACE_SOCKQ,因此QACE_SOCK_Acceptor是ACE_SOCK的一个子cR?/p> <p>ACE_SOCK_Stream是只负有通信传输功能的socketQ对应connection-oriented的TCP通信格式streamQ和UDP的CE_SOCK_CODgram相呼应。ACE_SOCK_Stream只是socket的通信载体Q在两个工厂ACE_SOCK_Connector和ACE_SOCK_Acceptor中初始化。这样一个类除支持最基本的数据发送(sendQ和接收QrecvQ和dQblockingQ、非dQnonblockingQ及定时QtimedQ的I/O模式外,q支持分散读取(scatter-readQ和集中写入Qgather-writeQ?/p> <p>对于一个简单的『网l课E作业:写一个有q接的IM程序』,上面q些内容已经_了。当然即使用对应的几个socket API也已l够了。但我们昄更加兛_如此庞大的一个库Q是如何解决复杂的网l应用的Q我其兛_的是多线Eƈ发如何更好的处理?/p> <p>所以,我准备跑到第8?章了?/p><img src ="http://www.shnenglu.com/Fox/aggbug/94973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2009-09-01 14:22 <a href="http://www.shnenglu.com/Fox/archive/2009/09/01/94973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Doxygen在Cygwin下的使用http://www.shnenglu.com/Fox/archive/2009/08/28/94689.htmlFoxFoxFri, 28 Aug 2009 09:14:00 GMThttp://www.shnenglu.com/Fox/archive/2009/08/28/94689.htmlhttp://www.shnenglu.com/Fox/comments/94689.htmlhttp://www.shnenglu.com/Fox/archive/2009/08/28/94689.html#Feedback5http://www.shnenglu.com/Fox/comments/commentRss/94689.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/94689.html本文同步?a target="_blank">游戏人生

我发现我最q成了Cygwin下的白鼠,写完Cygwin下安装ACEQ写ACE在cygwin下的使用。现在又?a target="_blank">doxygen?/p>

之前提到在Cygwin下读代码的不习惯Q后来回到VS下看。没q几天,觉得VS下还是不够直观,于是q接看ACE的doxygen?#8230;…

doxygen好是好,用v来还是要慢慢习惯才行Q需要在写注释和代码的时候注意一些,掌握的细节和技巧越多,出来的文档越丰富Q当Ӟq和代码质量是两码事Q?/p>

我自然是把doxygen安装在Cygwin下了Q由于doxygen没有提供infoQInfo doxygen时就自动打开了doxygen的manQ和man doxygen、doxygen --help一个效果?/p>

如果希望阅读更详的使用Ҏ(gu)Q只有自?a target="_blank">down一个manual?/a>?/p>

在Cygwin下,doxygen采用GNU的libiconvq行文字~码的{换,?a target="_blank">UTF-8作ؓ默认~码?/p>

使用doxygen生成config-file模板后,可以在config-file中进行一些项目设|(有注释的Q看的懂Q?/p>

Z支持中文Q我DOXYFILE_ENCODING用的?a target="_blank">EUC-CNQ但输出文档的语aOUTPUT_LANGUAGE却选了English。两点原因:

o EUC-CNQ各U汉字编码知识就不在此普及了Q你可以认ؓ体字~码都是EUC-CNQ和UTF-8不同Q但OUTPUT_LANGUAGE的各U语a都是使用的UTF-8Q?span style="text-decoration: line-through;">所以两U编码不可能同时昄Q当Ӟ你可以把EUC-CN全{成UTF-8。编码不是高U的技术,但对于非p用户l对是一个噩?/span>Q?span style="color: rgb(34, 34, 34); font-family: Georgia, Arial; font-size: 14px; ">后来发现是我自己学艺不精QDOXYFILE_ENCODING只是配置文g的编码格式而已Q而识别中文文档只需要修改INPUT_ENCODING成EUC-CN卛_QOUTPUT_LANGUAGE自然讄成Chinese也不会有问题Q因为doxygen采用UTF-8输出Q用中文输Z会有q问题?/span>

o 虽然我的英文很蹩脚,虽然我的文档中多有中文注释。但像doxygen中文输出的文档中把class、public都给你翻译成中文Q你也受不了Q这也英文水qx兟?/p>

config-file中的其他内容我现在也用不刎ͼ没有仔l看?/p>

因ؓKevin会在公司里讲一下doxygenQdoxygen的manual也讲的很详细Q我qҎ(gu)_不翻译文档了?/p>

单的一?a target="_blank">Doxygen的测?/a>在这里?/p>

Fox 2009-08-28 17:14 发表评论
]]>
ACE之Cygwin vs Winhttp://www.shnenglu.com/Fox/archive/2009/08/24/94234.htmlFoxFoxMon, 24 Aug 2009 03:59:00 GMThttp://www.shnenglu.com/Fox/archive/2009/08/24/94234.htmlhttp://www.shnenglu.com/Fox/comments/94234.htmlhttp://www.shnenglu.com/Fox/archive/2009/08/24/94234.html#Feedback6http://www.shnenglu.com/Fox/comments/commentRss/94234.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/94234.html本文同步?a target="_blank">游戏人生

我屈服了Q还是VS用的方便?/p>

之前在Cygwin下已l可以用的ACEQ因为阅M码太不方便(对于一个WinEr来说Q,上午在VS下面׃几分钟就把ACE配好了,而且使用$(ACE_ROOT)\examples\C++NPv1的代码跟t调试,太习惯了?/p>

按照$(ACE_ROOT)\ACE-INSTALL.html的安装说明:

o 选择q打开$(ACE_ROOT)\ace\ace_vc9.sln

o dconfig.hq加入以下内容:

   #define ACE_HAS_STANDARD_CPP_LIBRARY 1
    #include "ace/config-win32.h"

o F7

-----------------------------------------------

OKQ现?(ACE_ROOT)\lib下面已经生成了ACEd.dll、ACEd.libQ再讄一下系l环境变量(q行E序必需Q和VC++目录Q调试程序必需Q。可以用了Q?

o 选择q打开$(ACE_ROOT)\examples\C++NPv1

o F7

o

Fox 2009-08-24 11:59 发表评论
]]>
ACE在cygwin下的使用http://www.shnenglu.com/Fox/archive/2009/08/19/93781.htmlFoxFoxWed, 19 Aug 2009 02:05:00 GMThttp://www.shnenglu.com/Fox/archive/2009/08/19/93781.htmlhttp://www.shnenglu.com/Fox/comments/93781.htmlhttp://www.shnenglu.com/Fox/archive/2009/08/19/93781.html#Feedback4http://www.shnenglu.com/Fox/comments/commentRss/93781.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/93781.html本文同步?a target="_blank">游戏人生

int ACE_TMAIN(int, ACE_TCHAR *[])
{
     ACE_TRACE(ACE_TEXT("main"));

     ACE_DEBUG((LM_INFO, ACE_TEXT("%IStart\n")));
     ACE_DEBUG((LM_INFO, ACE_TEXT("%IEnd\n")));

     return 0;
}

/*--------- makefile ---------*/

BIN     = hello                       # src & exe file name
SRC     = $(addsuffix .cc, $(BIN))    # src file suffix
LIBS    = -lACE                       # libACE.dll under cygwin

include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
include $(ACE_ROOT)/include/makeinclude/macros.GNU
include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
include $(ACE_ROOT)/include/makeinclude/rules.local.GNU

/*--------- Compilation ---------*/

GNUmakefile: /home/fox/ace/GNUmakefile MAKEFLAGS=k

g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe    -pipe   -I/usr/\
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE  -c -o .obj/hello.o hello.cc
g++ -Wpointer-arith -mthreads -mtune=pentiumpro -O3 -g -pipe    -pipe   -I/usr/\
share/ace -DACE_HAS_EXCEPTIONS -DACE_NO_INLINE  -Wl,--enable-auto-import -Wl,-E\
-L/usr/share/ace/lib -o hello .obj/hello.o  -lACE

Compilation finished at Wed Aug 19 00:35:42

/*--------- Result ---------*/

$ ./hello.exe
(14417928) calling main in file `hello.cc' on line 13
    Start
    End
(14417928) leaving main

-------------------------------------------------------

更多内容请参?a target="_blank">C++NP(C++ Network Programming) vol.1 & vol.2和APG(The ACE Progrmmer's Guide)?/p>

忙活了一晚上Q终于知道怎么包含头文件了Q在gcc的编译选项中用 -I?I$(ACE_ROOT)Q?/p>

本例中是Q?I/usr/share/ace

l果后面库又链接不上Q联想以前用OpenGL库的LIBSQ终于靠一?lACE搞定?/p>

因ؓ不愿意用MPCQL觉再多花些时间去弄又只是题更远了,有兴的同学自然是可以通过ACE的官|找到所有问题的{案?/p>

q样一来,ACE在cygwin下从安装C用也告一D落了,后面的问题就比较easy了,无非是你用ACE做什么。而我也不会再ACE && cygwin写什么心得了Qȝ见证了这两天的捣腾?/p>



Fox 2009-08-19 10:05 发表评论
]]>
Ʒݾþþþ | þþƷһպAV| ۲˾þþƷٸAV| Ʒþþþþþ| ձɫۺϾþӰԺ| ˾þô߽AVһ| þþþav| þҹɫƷ鶹| AVӰƬþþþþ| 97þùۺϾƷŮ | þþòƷһ| ޾ƷƵþþ| ۲ӰԺþ99| 99þɫĻ| Ʒ99þò| ҹҹݺݾþAV| ޹Ʒ۲ӰԺþ | ݺɫۺϾþ| þþþø߳ۺӰԺ| þ¶Ʒ| ˾þĻ| ޾Ʒþþþþþþþþþ | һþöAV| ޺ݺݾþۺһ77777| Ʒ99þþþƷ| þþƷһ| ޾Ʒ99þ| þþƷһ | ݹƷþþþþ| ŷպƷþþѹۿ| ҹƷþþþþžŵӰ | ҹþþ| ŷƷƵһþþþƷ | ޹Ʒþþ| þ޹ƷAVϼ| ƬҹƬþ| רþ| ޾Ʒ97þĻ| þþƷһӰԺ| þþƷAV| ձƷþ|