关于用map管理会话

3 views
Skip to first unread message

CheZhuLin

unread,
Jun 23, 2008, 2:22:07 AM6/23/08
to dev4s...@googlegroups.com

Hi,大家好!

 

如果用map管理会话,用什么作为map的键啊?

我想到的有:

 

  1. socket句柄
  2. 会话指针
  3. ipport的组合(要至少6个字节)
  4. 用户id(需要收到第一个包后才知道)

 

大家都是用的哪一个啊!

 

我现在用的是socket句柄,但是处理有点罗嗦:在关闭socket的同时,必须将该会话对象从map中移除,否则该socket

被系统重新分配后,有可能和map中的对象冲突。

 

这样就只有在IO线程中PendingIO返回时,靠会话对象的pendingiocount确定何时删除该会话对象了,因为当一个会话已经关闭,但是还有pendingio没有返回时,就无法在io线程的外面得到该会话对象了。

 

总觉得在一个线程中定期检查会话map中的每一个会话的PedingioCount和是否被关闭标志,再释放该会话比较安全,这样就必须在关闭会话时不能将该会话从map中移除,这就产生了矛盾

不知我说清楚了没有,大家又是如何解决该问题的呢?

 

谢谢!

stephen.nil

unread,
Jun 23, 2008, 10:49:26 AM6/23/08
to dev4s...@googlegroups.com
Hi,

http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e

之前这里有过一次讨论,可以先看一看。

Best regards,

stephen.nil
2008-06-23

>>>
>Hi,大家好!
>
>
>
>如果用map管理会话,用什么作为map的键啊?
>
>我想到的有:
>
>
>
>1. socket句柄
>2. 会话指针
>3. ip和port的组合(要至少6个字节)
>4. 用户id(需要收到第一个包后才知道)

stephen.nil

unread,
Jun 23, 2008, 10:49:26 AM6/23/08
to dev4s...@googlegroups.com
Hi,

http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e

之前这里有过一次讨论,可以先看一看。

Best regards,

stephen.nil
2008-06-23

>>>
>Hi,大家好!
>
>
>
>如果用map管理会话,用什么作为map的键啊?
>
>我想到的有:
>
>
>
>1. socket句柄
>2. 会话指针
>3. ip和port的组合(要至少6个字节)
>4. 用户id(需要收到第一个包后才知道)

杨光

unread,
Jun 25, 2008, 11:13:51 PM6/25/08
to dev4s...@googlegroups.com
为什么要用MAP呢?用verctor;list不很好吗?
struct netinfo
{
  socket sock;
  int userid;
  bool isuse;//是否使用
}
vector<netinfo> netlist;或 list<netinfo> netlist;

2008/6/23 stephen.nil <steph...@gmail.com>:

小贵子

unread,
Jun 26, 2008, 2:22:55 AM6/26/08
to dev4s...@googlegroups.com
如果要查找,那怎么办?

2008/6/26 杨光 <yanggu...@gmail.com>:



--
一把锋利的宝剑,要经过无数次的磨炼,才从愚钝走向飘逸

邱宇舟

unread,
Jun 26, 2008, 3:31:06 AM6/26/08
to dev4s...@googlegroups.com
用boost的multi_index库可以多个键
像这样

        typedef multi_index_container<
            User,
            indexed_by<
            ordered_unique<member<User,SystemAddress,&User::address> >,
            ordered_unique<member<User,boost::uint64_t,&User::userUniID> >
            >
        > tUserList;

2008/6/26 小贵子 <xgz...@gmail.com>:

邱宇舟

unread,
Jun 26, 2008, 3:35:33 AM6/26/08
to dev4s...@googlegroups.com
用boost的multi_index库可以多个键
像这样

        typedef multi_index_container<
            User,
            indexed_by<
            ordered_unique<member<User,SystemAddress,&User::address> >,
            ordered_unique<member<User,boost::uint64_t,&User::userUniID> >
            >
        > tUserList;

2008/6/26 小贵子 <xgz...@gmail.com>:
如果要查找,那怎么办?

关中刀客

unread,
Jun 26, 2008, 6:54:37 AM6/26/08
to 高性能网络编程邮件列表
我使用map

On 6月26日, 下午3时35分, "邱宇舟" <qbowa...@gmail.com> wrote:
> 用boost的multi_index库可以多个键
> 像这样
>
> typedef multi_index_container<
> User,
> indexed_by<
> ordered_unique<member<User,SystemAddress,&User::address> >,
> ordered_unique<member<User,boost::uint64_t,&User::userUniID> >
> >
> > tUserList;
>
> 2008/6/26 小贵子 <xgz...@gmail.com>:
>
>
>
> > 如果要查找,那怎么办?
>
> > 2008/6/26 杨光 <yangguang2...@gmail.com>:
>
> > 为什么要用MAP呢?用verctor;list不很好吗?
> >> struct netinfo
> >> {
> >> socket sock;
> >> int userid;
> >> bool isuse;//是否使用
> >> }
> >> vector<netinfo> netlist;或 list<netinfo> netlist;
>
> >> 2008/6/23 stephen.nil <stephen....@gmail.com>:
>
> >> Hi,
>
> >>>http://groups.google.com/group/dev4server/browse_thread/thread/29a910...
>
> >>> 之前这里有过一次讨论,可以先看一看。
>
> >>> Best regards,
>
> >>> stephen.nil
> >>> 2008-06-23
>
> >>> >Hi,大家好!
>
> >>> >如果用map管理会话,用什么作为map的键啊?
>
> >>> >我想到的有:
>
> >>> >1. socket句柄
> >>> >2. 会话指针
> >>> >3. ip和port的组合(要至少6个字节)
> >>> >4. 用户id(需要收到第一个包后才知道)
>
> >>> >大家都是用的哪一个啊!
>
> >>> >我现在用的是socket句柄,但是处理有点罗嗦:在关闭socket的同时,必须将该会话对象从map中移除,否则该socket值
>
> >>> >被系统重新分配后,有可能和map中的对象冲突。
>
> >>> >这样就只有在IO线程中PendingIO返回时,靠会话对象的pendingiocount确定何时删除该会话对象了,因为当一个会话已经关闭,但是还有p-endingio没有返回时,就无法在io线程的外面得到该会话对象了。
>
> >>> >总觉得在一个线程中定期检查会话map中的每一个会话的PedingioCount和是否被关闭标志,再释放该会话比较安全,这样就必须在关闭会话时不能将该-会话从map中移除,这就产生了矛盾
>
> >>> >不知我说清楚了没有,大家又是如何解决该问题的呢?
>
> >>> >谢谢!
>
> > --
> > 一把锋利的宝剑,要经过无数次的磨炼,才从愚钝走向飘逸- 隐藏被引用文字 -
>
> - 显示引用的文字 -

wantsoft

unread,
Jul 2, 2008, 10:56:12 PM7/2/08
to dev4s...@googlegroups.com
用map查找几次运算就可以实现。
用list查找取决于list的大小。

-------------------------------------------------------------
Sender:杨光
Date:2008-06-26 11:13:54
Receiver:dev4s...@googlegroups.com
CC:
Subject:Re: 关于用map管理会话

jonney.wang

unread,
Jul 19, 2008, 11:56:02 AM7/19/08
to 高性能网络编程邮件列表
可以创建一个唯一的序列号来标示事务,用序号做MAP的主键就可以了
Reply all
Reply to author
Forward
0 new messages