随笔-341  评论-2670  文章-0  trackbacks-0
    开始设计一个对称的通讯框架了。这个框架要求所有client的电脑上有一组host threads。host threads可以在另一个程序里面。有了host之后,client就可以跟远程或者本机的程序通讯了。client可以做的事情有:与host连接与断开,指定一个远程的client并发送信息,通知host可以不必继续维护到某client的连接,查询某个ip和端口下面的所有client。每一次通讯的时候,client都必须给出ip\port\name来,而不是获取一个连接然后使用。鉴于client和host未必在同一个程序上,获得连接然后使用不是很好。

    因此就有了如下的设计。host通过socket与其他地方的host通讯,client与host通过named pipe联系。client与client的信息通过两个或更多的host传递。到了这里,就有必要指定一下协议了。

    首先是client-host。client-host发的消息的格式是:Type:BYTE , NameLen:BYTE , Name:CHAR[ ] , MsgLen:INT , Msg:CHAR[ ]。这5部分串在一起成为一个完整的消息通过named pipe传递。Type定义如下:

    client发给host:
        0:CONNECT_TO_HOST , Name=ignore , Message=client name
        1:DISCONNECT_TO_HOST , Name=ignore , Message=ignore
        2:COMMUNICATE , Name="ip\port\client name" , Message=?
        3:REQUEST_LIST , Name="ip\port\*" , Message=ignore
        4:COMMUNICATE_FINISH , Name="ip\port\client name" , Message=ignore
    host发给client:
        0:ERROR , Name=ignore , Message=?
        1:DISCONNECT_TO_CLIENT , Name=ignore , Message=ignore
        2:COMMUNICATE , Name="ip\port\client name" , Message=?
        3:RECEIVE_LIST , Name="ip\host\*" , Message="name1\name2\...."

    其次是host与host之间的消息。消息的格式是Type:BYTE , SourceLen:BYTE , SourceName:CHAR[ ] , DestLen:BYTE , DestName:CHAR[ ] , MsgLen:INT , Msg=CHAR[ ]。跟client-host一样,也是串在一起成为一个完整的消息的。Type定义如下:

    消息:(HELLO在不同的状态下有不同的意义)
        0:ERROR , Source=ignore , Dest=ignore , Message=?
        1:HELLO , Source=ignore , Dest=ignore , Message=?
        2:HELLO_RESPONSE , Source=ignore , Dest=ignore , Message=HELLO的消息内容反转
        3:DISCONNECT , Source=ignore , Dest=ignore , Message=ignore
        4:COMMUNICATE , Source="client name" , Dest="client name" , Message=?
        5:REQUEST_LIST , Source=ignore , Dest=ignore , Message=ignore
        6:RECEIVE_LIST , Source=ignore , Dest=ignore , Message="name1\name2\...."

    因为client每一次发消息都要填上地址,因此host可以自行决定要不要将某些socket断开。同理,COMMUNICATE_FINISH也是可以不发的,这只是为了资源管理的灵活性而设置的。这个东西就暂时命名为Vczh Messenger吧。Vczh Messenger将提供两套类库。第一套用于建立host,第二套用于建立client。这样的话,一个程序可以决定跟其他程序共享host或者是自己给自己建立host。client将使用事件驱动模型。配合vl::system::synchronize命名空间下的一些组件可以很容易将事件驱动模型修改为其他各种各样的模型。

    Vczh Messenger在逻辑上是无连接无顺序的通讯框架,用于为进一步的remote object access服务。
posted on 2008-08-02 06:47 陈梓瀚(vczh) 阅读(1757) 评论(4)  编辑 收藏 引用 所属分类: C++

评论:
# re: Vczh Messenger 2008-08-02 06:57 | Lnn
强!  回复  更多评论
  
# re: Vczh Messenger 2008-08-02 07:39 | 空明流转
都不知道你现在在做些啥。。。  回复  更多评论
  
# re: Vczh Messenger 2008-08-02 09:05 | ronliu
很好的思路,
觉得没有必要区分client和host。client之间发消息,需要通过各自的host来中转,中转的次数太多,增加了复杂度。
一台主机上有一个host对应很多个client的情况我想不多,即使有,也只是少数的服务器型的机器。
另外,能否说明一下你的这个框架预计的应用场景呢?  回复  更多评论
  
# re: Vczh Messenger 2008-08-02 21:39 | 陈梓瀚(vczh)
我想在c++上再现Windows Communication Foundation的『模式』,并加强。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理