找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: freeeyes

ACE开源服务器研究(SVN和git版本持续更新中)

 火... [复制链接]
发表于 2012-9-14 13:47:00 | 显示全部楼层
简单看了一下几个文档,有个东西想讨论下
1、这里面用一个类来做消息封装,传到某个dll里面,我觉得没必要这样。
作为消息/数据传递的机制,就用最简单得const unsigned char *就好了,如果需要有标示,那么可以考虑在前2个字节做标示。
这样不会出现因为编译环境等等原因出现的问题,而且也具有语言扩展性。

我个人不太喜欢应用比如运算符重载这类非常具有c++特性的东西,因为并不是所有语言都支持这个。
一方面作为开发者,大家的习惯都不一样,而且协议这东西也是多种多样;另一方面有些时候通过脚本语言执行逻辑具有更好的扩展性和灵活性,这时候传递更底层的buffer就更容易一些。


2、没必要所有的消息都要经历中心服务,通过配置,可以向服务器注册若干worker,这些worker之间无非是input/output这种关系,有些通信是可以在worker之间
而非通过中心服务器来运转的。这些worker之间可以有自己的约定。或者通过一个自描述的结构来做信息传递。

当然,我是刚刚看这东西,很多地方认识可能根本就是错误的,所以只是讨论一下。
发表于 2012-9-14 16:21:56 | 显示全部楼层
谁调试过TestTCPPost例子,我发现了一个问题,在运行到
发表于 2012-9-14 16:23:30 | 显示全部楼层
谁调试过TestTCPPost例子,我发现了一个问题,在运行到
if(false == m_pServerObject->GetClientManager()->SendData(1, szPostData, (int)ACE_OS::strlen(szPostData)))时,内存溢出,报错:
*** glibc detected *** ./PurenessScopeServer: free(): invalid pointer: 0xb391213c ***
======= Backtrace: =========
/lib/libc.so.6[0x3c0ee5]
/lib/libc.so.6(cfree+0x59)[0x3c1329]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x71195c1]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0x711961d]
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN13ACE_Task_Base7svc_runEPv+0x52)[0xc5f932]
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN18ACE_Thread_Adapter8invoke_iEv+0xee)[0xc606fe]
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN18ACE_Thread_Adapter6invokeEv+0x76)[0xc608f6]
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(ace_thread_adapter+0x11)[0xbec0f1]
/lib/libpthread.so.0[0x143852]
/lib/libc.so.6(clone+0x5e)[0x42a0ae]
======= Memory map: ========
发表于 2012-9-14 16:23:58 | 显示全部楼层
请问谁能帮忙解决
发表于 2012-10-19 09:46:12 | 显示全部楼层
我现在用的0.86版本  PurenessScopeServer  

编译完了packetParse  和TcpTest  
都拷贝到了  windows_bin下
然后编译主框架  最后生成完的执行文件叫
PurenessScopeServer_D.exe
多了一个_D  不清楚是哪里配置的,而且运行出错
我刚开始接触VS环境  麻烦高手们给分析下  谢谢
发表于 2012-10-19 13:29:29 | 显示全部楼层
问题解决了
发表于 2012-10-20 23:51:19 | 显示全部楼层
哪位达人研究过版主达人的TestTCPPost功能?我想请教在bool RecvData(CClientParse* pClientParse)中如何实现接收服务器端传过来的数据????
发表于 2012-10-29 17:35:41 | 显示全部楼层
发现2个BUG,各位达人帮忙看看是不是:
bool CClientReConnectManager::SetHandler(int nServerID, CConnectClient* pConnectClient)
{
        if(NULL == pConnectClient)
        {
                OUR_DEBUG((LM_ERROR, "[CProConnectManager::SetHandler]pProConnectClient is NULL.\n"));
                return false;
        }

        ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_ThreadWritrLock);
        mapReactorConnectInfo::iterator f = m_mapConnectInfo.find(nServerID);
        if(f == m_mapConnectInfo.end())
        {
                //如果这个链接已经存在,则不再添加到已经存在的客户端map管理中
                OUR_DEBUG((LM_ERROR, "[CProConnectManager::SetHandler]nServerID =(%d) is exist.\n", nServerID));
                return false;
        }

        return true;
}
1、红色应该改为:if(f != m_mapConnectInfo.end())
2、在“return true”上一行添加:
        pConnectClient->SetServerID(m_nServerID);
        pConnectClient->reactor(m_pReactor);
        if(m_pReactorConnect->connect(pConnectClient, m_AddrServer) == -1)
        {
                OUR_DEBUG((LM_ERROR, "[CReactorClientInfo::Run]m_pAsynchConnect open error(%d).\n", ACE_OS::last_error()));
                //这里设置为True,为了让自动重试起作用
                return true;
        }
发表于 2012-10-31 22:28:10 | 显示全部楼层
ProConnectManager::AddConnect函数中的m_u4ConnectCurrID会一直累加,如果到达极限会咋样?是不是处理一下比较好?
发表于 2012-11-1 22:20:57 | 显示全部楼层
_MessageBase结构体里面的成员,为啥不做字节对齐呢?做字节对齐应该要好些吧?
struct _MessageBase
{
    //  数据包来源类型
    uint8   u1PacketType;
    //  消息链接ConnectID,如果是UDP则这个值无效
    uint32  u4ConnectID;
    //  数据包的ID
    uint32  u4PacketID;
    //  命令字的ID
    uint16  u2Cmd;
    //  消息接收到的时间
    uint32  u4MsgTime;
    //  客户端IP(目前只有UDP会赋值,TCP可以根据ConnectID自己去获取)
    char    szIP[MAX_BUFF_20];
    //  客户端端口(目前只有UDP会赋值,TCP可以根据ConnectID自己去获取)
    uint32  u4Port;
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-18 19:00 , Processed in 0.019922 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表