libjingle网络封装小探

PhysicalSocketServer是libjingle 的socket server 
socket server是什么?
socket server继承了SocketFactory
SocketFactory明显就是生产socket的地方
也就是说PhysicalSocketServer 是socket的工厂实现

这个工厂的实现中
virtual Socket* CreateSocket(int type);
virtual AsyncSocket* CreateAsyncSocket(int type);
当然是生产socket的地方

但它还有几个函数
  void Add(Dispatcher* dispatcher);
 void Remove(Dispatcher* dispatcher);
是干什么的?
首先代码里面就写了个vector的add erase(这个类中有dispatcher的vector)
什么是dispatcher?

 


class Dispatcher {
public:
  virtual uint32 GetRequestedEvents() = 0;
  virtual void OnPreEvent(uint32 ff) = 0; 
  virtual void OnEvent(uint32 ff, int err) = 0;
  virtual WSAEVENT GetWSAEvent() = 0;
  virtual SOCKET GetSocket() = 0;
  virtual bool CheckSignalClose() = 0;
};
这个就是dispatcher,就是个实现了一堆函数的一个类。

这个是虚类

它的实现一般如何
class SocketDispatcher : public Dispatcher, public PhysicalSocket就是它的一个实现类
明显它同时是个PhysicalSocket
这个东西主要是将socket的操作和实现模型的操作结合起来了,在这个函数
OnEvent(uint32 ff, int err)中触发PhysicalSocket中的一些signal.


下面来看看PhysicalSocket,这个是socket的真正实现类
它包装了一个SOCKET s_; 其他的socket包装都是虚的
它实现了socket的基本操作,但它必须和一个PhysicalSocketServer,联系在一起。
同时它是AsyncSocket,
class AsyncSocket : public Socket, public sigslot::has_slots<>
它就是Socket,这个Socket可不是SOCKET,它只是一个接口而已。可以操作connect ,close等一些操作

PhysicalSocket必须是个非阻塞的socker
bool Initialize() {
    assert(s_ != INVALID_SOCKET);
    // Must be a non-blocking
    u_long argp = 1;
    ioctlsocket(s_, FIONBIO, &argp);
    ss_->Add(this);
    return true;
  }
 这就清楚了
 
 Socket* PhysicalSocketServer::CreateSocket(int type)
 AsyncSocket* PhysicalSocketServer::CreateAsyncSocket(int type)
 这两个函数一个返回PhysicalSocket
 一个返回SocketDispatcher,同时会加入到server的那个dipacher的vector里面
 
 PhysicalSocketServer::Wait 是异步socket的核心,它里面调用了WSAEventSelect来完成这些工作,异步事件触发它会通知相应的dispatcher调用相应的操作函数。
 
 最后想想需要实现的事就是这几个回调函数的内容,在异步请求发出后,而事件到达的时候调用这些事件来完成逻辑。而这些回调函数都写定了(当然可以直接写函数在signal上面注册)如何修改呢,很简单
 AsyncSocketAdapter就是帮你来做这个的,它将server 生产的AsyncSocket包装起来,同时将这个AsyncSocket完全包装起来,然后在这个adapter上面注册各种事件的回调,它就像个桥一样帮你完成所有的事情
 
 
 
 
 
 

 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值