随笔分类 -  网络

Win32下对多个的线程句柄的关闭的控制(下)
摘要:我的表达能力就达到这种程度了。接下来我会用Console程序和一个管理多句柄对象的类来实现上面的算法。文章长了点, 一部分发表不了。源码在《Win32下对多个的线程句柄的关闭的控制(下)》给出。下面是CMultipleHandles和一个基于Console的源码。// MultipleHandles.h// 作者: 黄瑞广 时间: 2004-02-06// 说明: 本类不支持线程安全class CMultipleHandles{private: int m_nNumOfHandle; public: HANDLE m_arrayHandle[MAXIMUM_WAIT_OBJECTS]; ... 阅读全文

posted @ 2012-11-16 09:45 daemonh 阅读(338) 评论(0) 推荐(0)

Win32下对多个的线程句柄的关闭的控制(上)
摘要:网上看到自己04年发表在CSDN上的文章,当时还上了首页。现在看来蛮幼稚的,很有趣;当时应该没有blog这种东东,现在发表到blog上,纪念一下逝去的青春。-----------------------------------------------------------------------------------------------------前段时间做的一个项目, 其中涉及对管理多线程句柄的要求。现在整理一下思路,将它写出来,希望对部分的朋友有所帮助。我的程序要实现的功能是:多个同时运行的子线程中,当有一个子线程运行结束时,主线程要及时地或者在某个有效范围内关闭子线程句柄;而且在 阅读全文

posted @ 2012-11-16 09:43 daemonh 阅读(942) 评论(0) 推荐(0)

修改一行代码的顺序引发恶心bug
摘要:起因原来的代码 m_recvBuffer->Clear(); m_multiplexor->Register(this, Herm::READ_MASK);Session初始化的时候,先把接收buffer清空,再注册读事件。几周前,加了一个小功能, 抽了一个小函数,最后代码顺序变化了一下 m_multiplexor->Register(this, Herm::READ_MASK); m_recvBuffer->Clear();悲剧出现了,在大量的客户端连接,发请求数据的时候,有很低的概率出现某个客户端没收到回应。这个东西是前几年整理的,这几年基本没怎么动了,细节流程没有 阅读全文

posted @ 2012-10-24 18:18 daemonh 阅读(254) 评论(0) 推荐(0)

TCP4次关闭状态
摘要:这个状态老记不住,网上copy一张。 阅读全文

posted @ 2012-04-27 10:17 daemonh 阅读(127) 评论(0) 推荐(0)

记录:protobuf在网游中的用法(二)
摘要:在上一篇介绍的protobuf用法(http://blog.csdn.net/herm_lib/article/details/7384613),有点偏复杂了。可以简化一下。结构: total_len[16] + head_len[8] + head + body。这次像上一篇介绍最后介绍的一样,把head和body分开了,这样可以让服务器对消息的处理更灵活,有时候,服务器只要head内容,这样可以针对性地只解析head,而不用把body内容也解析出来。头定义差不多像下面的样子:package ProtoCS;message Head{ required uint32 cmd_id = 1; 阅读全文

posted @ 2012-03-25 15:44 daemonh 阅读(209) 评论(0) 推荐(0)

记录:protobuf在网游中的用法
摘要:消息传递过程:client ---> gated ---> zonedCS消息结构:message Head { uint32 cmd_id; } message Body { AuthReq auth_req; } message CSMessage { Head head; Body body; }发送数据格式:16bits len + CSMessage。gated--->zoned也有一套消息message GZMessage { uint32 uid; // 账户ID ... 阅读全文

posted @ 2012-03-22 20:24 daemonh 阅读(217) 评论(0) 推荐(0)

以太网原理与最小帧长(傻瓜版)
摘要:转自 http://www.chinaunix.net 作者:a_la_lei发表于:2008-10-17 09:43:47熟悉了最小帧长,可以说就明白了为什么基于CSMA/CD协议的以太网有网段长度限制,同时也掌握了以太网的精髓。在这之前,我们应该先了解一下CSMA/CD协议。什么是CSMA/CD协议(载波侦听多路访问/冲突检测协议)?一个房间有很多人,如果同时说话,就谁也听不清楚别人说什么,于是大家约定了一个机制:每个人在说话之前先听一下有没有其他人说话(载波侦听),如果有,自己就先不说话,如果没有,就说话。如果大家同时发现房间里没有人说话,则同时开口,此时就产生冲突(冲突检测),产生冲突 阅读全文

posted @ 2012-03-09 09:56 daemonh 阅读(663) 评论(0) 推荐(0)

字节序转换优化
摘要:在一定的前提条件下,字节序转化可以做到对服务器透明,也就是说服务器不用调用htons&ntohs的等函数。首先得满足下面几个条件:1. 非标准产品 比如某个公司游戏产品,这类一般就公司自己的客户端或满足特定条件的第三方插件才能连接服务器。2. 项目组自己解析协议消息 如果项目是用像protobuf这种协议消息工具正常情况下,无法做到这类优化。优化方案:1. Client发协议消息前知道Server用的是哪种字节序 简单的方法是直接在配置文件里指定Server字节序,因为是自己的产品,运营的时候,大部分情况下是知道Server环境的字节序的。 如果有特殊要求,可能Server的字节序是不 阅读全文

posted @ 2011-10-20 14:16 daemonh 阅读(239) 评论(0) 推荐(0)

记录:几类协议的区分
摘要:REQ(REQuire): 请求类协议,一般是client主动发起。RES(RESponse): 回应类协议,对REQ的一个回应,带有处理结果的数据包。ACK(ACKnowledge): 确认类协议,对REQ的一个回应,与上面的区别是数据包中只有确认序号之类的东西,没有其他内容。NTS(NoTiCE): 通知类协议,这类协议,接收者无须回应(RES或ACK)。 阅读全文

posted @ 2011-05-25 11:10 daemonh 阅读(260) 评论(0) 推荐(0)

TCP的拥塞控制
摘要:拥塞处理可以认为是TCP最重要的网络功能,拥塞的实现算法对TCP整体效率(吞吐量、传输速率等)有很大的影响。TCP拥塞实现算法是针对各种复杂的网络环境,从这点上看,一个UDP的应用采用简化了的TCP拥塞算法,在相对简单的网络环境下能得到对TCP更好的传输效率。拥塞发生判定条件1. 数据段(segment)发送超时 数据段发送超时,说明这个数据段或该数据段的ACK在传输的过程中丢失了;网络状况不理想,产生拥塞了。2. 收到重复的ACK 看下面的一个数据段丢失的情形: Sender Receiver | | |-------- segment1-------> | |<-------A 阅读全文

posted @ 2011-02-20 18:09 daemonh 阅读(217) 评论(0) 推荐(0)

TCP/UDP 常见的错误码
摘要:在实际TCP&UDP C/S数据收发过程中,常见error code有ECONNABORTED(WSAECONNABORTED),ECONNRESET(WSAECONNRESET),nonblocking io当然还有WOULDBLOCK(WSAWOULDBLOCK)。1. ECONNABORTED(WSAECONNABORTED) 这个tcp send引起的,一般是protocol stack重传超时或者protocol处理错误等。2. ECONNRESET(WSAECONNRESET) 对于TCP 远程主机已强制关闭,发送数据,远程主机protocol stack回应RST。 对于 阅读全文

posted @ 2011-01-11 17:24 daemonh 阅读(1757) 评论(0) 推荐(0)

在一个IP:Port建立多个连接和启动监听
摘要:1. Socket Handle和地址对 一个socket handle对应srcIP:srcPort&destIP:destPort 在同一个地址上建立多个连接,像下面的实例: ip1:port1 --> ip5:port5 ip1:port1 --> ip6:port6 接着在这个地址上创建监听socket, ip1:port1 --> *:* 对应所有的ip&port。2. Herm的实现代码 在同一个地址上创建多个socket handles,关键在于SO_REUSEADDR这个Socket层级别的选项,通过setsocketopt将这个选项打开,就可 阅读全文

posted @ 2010-12-13 17:07 daemonh 阅读(398) 评论(0) 推荐(0)

服务器实现心跳机制的两种策略
摘要:大部分CS的应用需要心跳机制。心跳机制一般在Server和Client都要实现,两者实现原理基本一样。Client不关心性能,怎么做都行。如果应用是基于TCP的,可以简单地通过SO_KEEPALIVE实现心跳。TCP在设置的KeepAlive定时器到达时向对端发一个检测TCP segment,如果没收到ACK或RST,尝试几次后,就认为对端已经不存在,最后通知应用程序。这里有个缺点是,Server主动发出检测包,对性能有点影响。应用自己实现 Client启动一个定时器,不断发心跳; Server收到心跳后,给个回应; Server启动一个定时器,判断Client是否存在,判断方法这里列两种:时 阅读全文

posted @ 2010-12-04 10:48 daemonh 阅读(548) 评论(0) 推荐(0)

对端进程和主机非法崩溃对本地的tcp连接的不同影响
摘要:1. 对端进程崩溃 对端协议栈将发出FIN;本地进程如果在recv或select/epoll,能感知到对端关闭。2. 对端主机崩溃 这个相当于拔网线或者中间路由器故障,崩溃端不做任何事情;本地进程只能通过SO_KEEPALIVE或应用的KEEPALIVE去检测对端挂了。 阅读全文

posted @ 2010-12-04 09:54 daemonh 阅读(247) 评论(0) 推荐(0)

使用 kqueue 在 FreeBSD 上开发高性能应用服务器
摘要:本文出处:http://www.ibm.com/developerworks/cn/aix/library/1105_huangrg_kqueue/ Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 概述kqueue是FreeBSD上的一种的多路复用机制。它是针对传统的select/poll处理大量的文件描述符性能较低效而开发出来的。注册一堆描述符到kqueue以后,当其中的描述符状态发生变化时,... 阅读全文

posted @ 2010-12-01 10:13 daemonh 阅读(510) 评论(0) 推荐(0)

导航