项目分析(channelid是如果产生的)
channelid如何生成的 /////////////////////////////////////////////////////////////// // // I_TCPServer.h // Description: // /////////////////////////////////////////////////////////////// #pragma once #ifndef _ChannelIDGenerator_H #define _ChannelIDGenerator_H #include <queue> #include <windows.h> class ChannelIDGenerator { public: ChannelIDGenerator() { m_size = 0; }; ~ChannelIDGenerator(){}; private: std::queue<int> m_ids; int m_size; public: void init(int start, int size) { if(m_size) MessageBox(NULL, L"init m_size超出范围", L"重大错误freeId(int id)", MB_OK); m_size = size; for (int i = start; i < start + m_size; i++) { m_ids.push(i); } } int getId() { if(m_ids.empty()) return -1; int id = m_ids.front(); m_ids.pop(); return id; } void freeId(int id) { if(id < 0 || id > m_size) MessageBox(NULL, L"channel id超出范围", L"重大错误freeId(int id)", MB_OK); m_ids.push(id); if((int)m_ids.size() > m_size) { MessageBox(NULL, L"channel id超出范围", L"重大错误freeId(int id)", MB_OK); int debug = 0; } } int getSize() { return m_size; } }; #endif 可以看出这个channelid是由队列中产生的 刚开始的时候插入12000个,每连接一个玩家的时候从front一个,每下线一个会push一个 刚开始的时候我以为这个队列不会乱,但发现会乱的,但这个没关系只要不会出现两个玩家的channelid一样就行了 如果上线的玩家大于12000的时候,我实验了一下发现每次front的时候都是-1,所以这个会造成channelid会重复,而服务器发送消息就是通过这个channelid发送的肯定会出错