posts - 68, comments - 8, trackbacks - 0, articles - 0
  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

事情如果有变坏的可能,不管这种可能性有多小,它总会发生。

posted @ 2010-06-09 12:11 Richmond 阅读(70) | 评论 (0)编辑 收藏

将整形,转化成字符串,已4位为一轮 32位应该是8位:
  int step = 0;
  DWORD dwKey = 0xF0000000;
  DWORD dwResult = 0;
  while (1)
  {
   dwResult = (m_dwTempSerialNo & dwKey) >> (28-4*step);
   serial[step] = (char)dwResult;

   step++;
   if (step == 8)
   {
    break;
   }
   dwKey = dwKey >> 4;
  }
  m_dwTempSerialNo = 0;

上面是白痴的方法,白痴啊白痴,简单的在这:
sprintf(serial, "%d", m_dwTempSerianNo);

posted @ 2010-06-08 14:41 Richmond 阅读(109) | 评论 (0)编辑 收藏

Acceptor接口抽象自IConnectionHandler的巧妙:保存断开。
 在lua中保存文件中 tostring(50) 好像保存类型还是int型 用"50"可以

posted @ 2010-05-07 15:26 Richmond 阅读(117) | 评论 (0)编辑 收藏

http://blog.sina.com.cn/s/blog_3ef6f4df0100gfpp.html

posted @ 2010-05-03 13:59 Richmond 阅读(83) | 评论 (0)编辑 收藏

 

1.这个地方要判断一下dwServerInfoDataLen是否等于sizeof(ServerInfo_Gateway),否则不安全;

2. 这里必须判断一下pMinData是否等于0;

3. 这个地方最好4字节对齐,对齐效率会高一些,也可以减少1字节对齐编译时可能出现的错误.中间可以插入一个WORD wPadding;或者WORD wReserved;

 

posted @ 2010-04-28 08:50 Richmond 阅读(92) | 评论 (0)编辑 收藏

1、printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果:192.168.0.74 : 192.168.0.74
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的。
2、memset(pData, 0, sizeof(pData));
3、好习惯:网络编程时,在网络传输的一定要网络字节序,客户端自己接受的事本机字节序。原因可能是系统环境不同(一般是服务器端,有可能windows环境和linux环境)。
4、

posted @ 2010-04-23 12:23 Richmond 阅读(124) | 评论 (0)编辑 收藏

今天,接了一个任务:在开启多个网关的情况下,怎么平衡多个网关的压力? 网关的压力主要是玩家,玩家多则压力大,玩家少则压力少,那么如何做到平衡呢?刚开始我的傻瓜式思维是:在每个玩家请求连接的情况下,寻找最少压力的网关,把相应的IP和端口发给客户端去练级。我的这个方案在实际应用中缺点:1、增加很大的复杂性;2、同时效率很低。根本原因是没有根据实际情况去分析,想当然。在一般情况下,游戏服务器端开一个网关就行了(很大情况下都是这样),当一个区人数逐渐增多时,需要多开网关,分担压力,所以可以设置一个变量去维护,当某个网关的人数很多时,可以让维护人员发送明天通知这个网关暂时不接受连接请求,并通过中心服务器把最少人数的网关IP和端口发送给这个客户端,让客户端去连接这个网关。(以上是基于我现在公司的服务器架构)
通过这件事,思考问题时,应该根据实际情况去思考,这样才能得出好的解决方案。有时相同问题在不同实际情况下解决方案也有不同。

posted @ 2010-04-22 20:36 Richmond 阅读(91) | 评论 (0)编辑 收藏

 记录记录

posted @ 2010-04-19 19:22 Richmond 阅读(61) | 评论 (0)编辑 收藏


在m_TimerAxis是GatewayServerImp的成员变量,如果在m_TimerAxis.CheckTimer()中执行了deleteGatewayServerImp类对象的时,就把m_TimerAxis的删了,所以m_TimerAxis.CheckTimer()执行完时出错,因为m_TimerAxis被删了,产生bug。

posted @ 2010-04-19 12:04 Richmond 阅读(110) | 评论 (0)编辑 收藏

参考:http://www.javaeye.com/topic/492652
1.如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket就要把它的属性设置成可以重复利用。这样有利于断线后的重连。

2.如果要将已经处于连接状态的socket在调用closesocket后强制关闭,不经历TIME_WAIT的过程,直接把这个Socket的SO_DONTLINGER这个属性设置掉。对于提高通信效率有比较好的帮助。

3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而这个时候就要设置收发时限,以增加socket在网络故障中的敏感程度,对于断线等网络异常立即做出反应。系统也好在短时间内做出相映的应对策略。

4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节 (约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发。

5.如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能,可以通过设置Socket的SO_SNDBUF属性来增加对发送数据的实际情况的了解。

6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区),增加系统对连接过程控制能力。

7.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)。

8.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,设置Socket的SO_LINGER属性让程序满足具体应用的要求(即让没发完的数据发送出去后再关闭socket)。(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)。注意:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用; 2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;

9.在SDI或者是Dialog的程序中,可以记录socket的调试信息:(做函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的具体协议,以及出错的代码都可以记录下来)就设置这个参数SO_DEBUG

10.往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,一般的习惯是自己写个处理网络缓冲的类,动态分配内存。

posted @ 2010-04-14 09:56 Richmond 阅读(781) | 评论 (0)编辑 收藏

仅列出标题
共7页: 1 2 3 4 5 6 7