freeeyes
发表于 2010-10-9 09:56:09
如果还有等待发送的数据,会有线程锁保持已经在发送数据的队列被处理。详细可以参照一下connecthandler.cpp里面的断开代码。还有发送队列部分。
wuyudry
发表于 2010-11-1 16:28:13
ProConnectHandle.cpp中的CProConnectHandle::PutSendPacket为什么在发送成功了以后进行m_nIOCount--操作? 投递的这个操作还没返回吧? 应该是在 handle_write_stream的发送成功里面m_nIOCount--吧?
还有,对m_nIOCount的加锁我很不理解,如果只是要锁++,--操作,可以用原子操作ACE_Atomic_Op。
但是假如handle_read_stream来了个断开连接的操作io,刚进函数,这时你调用发送函数PutSendPacket刚m_nIOCount++,release以后,handle_read_stream调用了CProConnectHandle::Close,这不是不会去析构了?
freeeyes
发表于 2010-11-2 10:04:28
1.ProConnectHandle: PutSendPacket()方法在
bool CProConnectHandle::SendMessage(IBuffPacket* pBuffPacket)函数里面被调用,在这里面有一行
m_ThreadWriteLock.acquire();
m_nIOCount++;
m_ThreadWriteLock.release();
这里进行了一次++操作。
你说的handle_write_stream()操作,我最早是这么写的,但是当发送出现拔出网线的情况时,handle_write_stream()函数是不会被proactor反应器调用,除非链接被系统确认完全断开才可以,这种情况下容易造成数据大量的堆积,为了解决这个问题,我把--操作放在了put中,意思就是当数据被放入系统队列成功我就认为这次IO完成了。
2.不会被析构,因为我会在Close里面判定是否还有当前才做,当所有的对这个类的当前操作结束的时候,才会最后析构这个类。有人建议我使用智能指针,我最后还是想用简单的计数器去实现。关于原子的ACE_Atomic_Op,我不知道在多线程下这个类是否稳定,而且就扩展性而言,在有些linux环境下原子操作会在gcc中获得警告,为了避免这些情况,我决定使用最简单的方法。
欢迎提问,呵呵。
wuyudry
发表于 2010-11-2 12:14:37
对于第二个问题,你可能理解错了。 我意思是你只锁了计数count,如果多线程下,是否存在,本来你进到CProConnectHandle::Close判断count是否为0的之前,CProConnectHandle::SendMessage那里正好++了,然后让你没删掉这个对象?
freeeyes
发表于 2010-11-2 18:44:57
你可以测试一下这种群概况,我测试过,似乎没有遇到问题。
nono436
发表于 2010-11-11 21:14:26
楼主你这个代码,接受2000连接大约需要多少时间?
freeeyes
发表于 2010-11-12 09:44:43
你用我的测试程序自己跑一下就知道了
res100
发表于 2010-11-12 10:43:34
ConnectServer.conf 具体起到什么作用可以介绍一下吗 ,我把ServerCount=1后,怎么就报错了,要如何设置,请楼主赐教!
freeeyes
发表于 2010-11-12 11:40:05
这个部分是链接中间服务器的,你必须设置一个已存在的中间服务器地址,你可以设置多个链接,链接个数就是ServerCount,服务器启动后会根据这个配置文件。建立若干个长连接。
这部分我正在重做,服务器间传输是要尽量做到通用有些难度。
最近忙于游戏开发,一直没时间整理这块。想等过两周,和stone,winston以及modern一起商讨一下顶一个服务期间数据传输标准后,将这部分替换掉。
如果你想使用是可以的,不过建议再等等我把这部分完善后。
如果很急,也可以自己实现一个在so中,不用我这个服务期间传输即可。
dbaicai
发表于 2010-11-15 15:20:07
挺好的,谢谢分享