http://blog.csdn.net/superleolx/article/details/5841281
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上面注册各种事件的回调,它就像个桥一样帮你完成所有的事情