teamtalk详解
CBaseSocket* FindBaseSocket(net_handle_t fd)
{
CBaseSocket* pSocket = NULL;
SocketMap::iterator iter = g_socket_map.find(fd);
if (iter != g_socket_map.end())
{
pSocket = iter->second;
pSocket->AddRef();
}
return pSocket;
}
在事件轮询里有FindBaseSocket()函数 net_handle_t 的使用创建
g_socket_map
的使用
所以最后针对具体的每一个事件监听的socket 都会掉用basesocket的onread .onwrite()
到这里一个事件驱动模型就行了
还要讲解一个结构体
//////////////////////////////
typedef struct {
uint32_t length; // the whole pdu length
uint16_t module_id; //
uint16_t command_id; //
uint16_t version; // pdu version number
uint16_t reserved; //
} PduHeader_t;
class DLL_MODIFIER CImPdu
{
public:
CImPdu();
virtual ~CImPdu() {}
uchar_t* GetBuffer();
uint32_t GetLength();
uint16_t GetVersion() { return m_pdu_header.version; }
uint16_t GetModuleId() { return m_pdu_header.module_id; }
uint16_t GetCommandId() { return m_pdu_header.command_id; }
uint16_t GetReserved() { return m_pdu_header.reserved; }
void SetVersion(uint16_t version);
void SetReserved(uint16_t reserved);
void WriteHeader();
virtual uint16_t GetPduType() { return 0; }
//读取pdu 头部信息
static int ReadPduHeader(uchar_t* buf, uint32_t len, PduHeader_t* header);
//读取cimpdu体的信息
static CImPdu* ReadPdu(uchar_t* buf, uint32_t len);
private:
//static cimpdu
static CImPdu* ReadPduLogin(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
//pdubuddylist
static CImPdu* ReadPduBuddyList(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
//pdugroup()
static CImPdu* ReadPduGroup(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
static CImPdu* ReadPduMsg(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
static CImPdu* ReadPduSwitchService(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
static CImPdu* ReadPduFile(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
static CImPdu* ReadPduOther(uint16_t command_id, uchar_t* pdu_buf, uint32_t pdu_len);
static bool _IsPduAvailable(uchar_t* buf, uint32_t len, uint32_t& pdu_len);
void _SetIncomingLen(uint32_t len) { m_incoming_len = len; }
void _SetIncomingBuf(uchar_t* buf) { m_incoming_buf = buf; }
protected:
CSimpleBuffer m_buf;
uchar_t* m_incoming_buf;
uint32_t m_incoming_len;
PduHeader_t m_pdu_header;
};
cimpdu是一个基本的信息结构体
这个结构体的内容就是
struct cimpdu {
int length //长度
module_id //模块id
commd_id//命令id
version//版本号
reserved//保留
}