eq::net::Node中的数据发送、接收,都是由其中的成员对象_connect完成。该对象为eq::net::Connection的对象指针,在win32下实例化为socketConnectionWin32对象,它采用WinSock的overlapped模型进行数据的发送接收。其实质是以多线程形式的阻塞模式,实现数据的异步传输。同时,Connection类也提供了直接面对数据缓存与Packet结构体的传输接口,从而简化了其在eq::net::Node中的应用。
在eq::net::Connection中,send/recv是高级接口,由应用对象,如eq::net::Node调用,而read/write是底层接口,用于直接处理数据传输的socket操作。高层接口内部通过底层接口执行网络操作,其接口与底层操作无关,因此由eq::net::Connection类直接实现。而底层的read/write所使用的接口与运行的平台相关,例如在windows中使用WinSock,在有的环境下会采取共享缓存方式,所以由不同的子类实现,如下图。
3.消息响应
eq::net::Node在初始化监听后会启动两个线程,分别用于接收监听到的数据以及处理数据中的指令,所有的数据都以消息的形式进程处理。其中_receiverThread用于将接收到的消息放入node的消息队列,而_commandThread则从消息队列中依次获取消息并根据消息执行操作。eq::Server在完成初始化后,会进入消息处理循环,不断从消息队列中获得新的消息并进行处理。
eq::net::Node中利用eq::net::ConnectionSet实现异步的网络通讯,并根据所接收到的消息进行简单响应。需要注意的是,这里通过异步接收到的消息并不是有效的应用消息。除了必要的异常消息外,Event_Data是其中最主要的消息,该消息中还包括收到该消息的connector,以及相应的数据大小。在_receiveThread线程中就是首先查询eq::net::ConnectionSet,当出现Event_Data消息后,即根据该消息的参数进行同步的数据接收真正有效的消息数据。(这种方式下,首先通过简单的异步消息避免了接收线程中不断的主动查询端口,然后只有在明确有有效数据到达时才读取端口,效率相对较高)