flowerfire
发表于 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
/lib/libc.so.6(cfree+0x59)
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN13ACE_Task_Base7svc_runEPv+0x52)
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN18ACE_Thread_Adapter8invoke_iEv+0xee)
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(_ZN18ACE_Thread_Adapter6invokeEv+0x76)
/home/liubin/ACE_wrappers/lib/libACE.so.6.0.5(ace_thread_adapter+0x11)
/lib/libpthread.so.0
/lib/libc.so.6(clone+0x5e)
======= Memory map: ========
生活如水
发表于 2012-9-14 16:23:58
请问谁能帮忙解决
☼_Andy_☽
发表于 2012-10-19 09:46:12
我现在用的0.86版本PurenessScopeServer
编译完了packetParse和TcpTest
都拷贝到了windows_bin下
然后编译主框架最后生成完的执行文件叫
PurenessScopeServer_D.exe
多了一个_D不清楚是哪里配置的,而且运行出错
我刚开始接触VS环境麻烦高手们给分析下谢谢
☼_Andy_☽
发表于 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, "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, "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, "m_pAsynchConnect open error(%d).\n", ACE_OS::last_error()));
//这里设置为True,为了让自动重试起作用
return true;
}
hopping
发表于 2012-10-31 22:28:10
ProConnectManager::AddConnect函数中的m_u4ConnectCurrID会一直累加,如果到达极限会咋样?是不是处理一下比较好?
hopping
发表于 2012-11-1 22:20:57
_MessageBase结构体里面的成员,为啥不做字节对齐呢?做字节对齐应该要好些吧?
struct _MessageBase
{
//数据包来源类型
uint8 u1PacketType;
//消息链接ConnectID,如果是UDP则这个值无效
uint32u4ConnectID;
//数据包的ID
uint32u4PacketID;
//命令字的ID
uint16u2Cmd;
//消息接收到的时间
uint32u4MsgTime;
//客户端IP(目前只有UDP会赋值,TCP可以根据ConnectID自己去获取)
char szIP;
//客户端端口(目前只有UDP会赋值,TCP可以根据ConnectID自己去获取)
uint32u4Port;
}