我在小型tcp聊天服务器上书写,但是遇到一些我无法解决如何“优雅地”解决的问题。

下面是我的主循环的代码:它可以:
1.建立新的tcp连接时,使用带有标记的基本事件启动一个向量。
2.获得此连接并将其推回向量中。然后,使用套接字创建一个CSingleConnection对象,并将该套接字传递给它。
  2.1。从CSingleConnection获取事件,该事件在连接接收到数据时被标记...
3.何时接收数据。等待已满并返回数组中句柄的编号...与所有其他矢量似乎似乎我可以确定现在正在发送的那个...

但是,正如大家看到的那样:这种方法真的很差。。。

有任何建议,改进等吗?...

void CServer::MainLoop()
{
    DWORD dwResult = 0;
    bool bMainLoop = true;
    std::vector<std::string> vecData;
    std::vector<HANDLE> vecEvents;              //Contains the handles to wait on
    std::vector<SOCKET> vecSocks;               //contains the sockets
    enum
    {
        ACCEPTOR = 0,           //First element: sequence is mandatory

        EVENTSIZE                   //Keep as the last element!
    };

    //initiate the vector with the basic handles
    vecEvents.clear();
    GetBasicEvents(vecEvents);

    while(bMainLoop)
    {
        //wait for event handle(s)
        dwResult = WaitForMultipleObjects(vecEvents.size(), &vecEvents[0], true, INFINITE);

        //New connection(s) made
        if(dwResult == (int)ACCEPTOR)
        {
            //Get the sockets for the new connections
            m_pAcceptor->GetOutData(vecSocks);

            //Create new connections
            for(unsigned int i = 0; i < vecSocks.size(); i++)
            {
                //Add a new connection
                CClientConnection Conn(vecSocks[i]);
                m_vecConnections.push_back(Conn);
                //Add event
                vecEvents.push_back(Conn.GetOutEvent());
            }
        }

        //Data from one of the connections
        if(dwResult >= (int)EVENTSIZE)
        {
            Inc::MSG Msg;
            //get received string data
            m_vecConnections[dwResult].GetOutData(vecData);

            //handle the data
            for(unsigned int i = 0; i < vecData.size(); i++)
            {
                //convert data into message
                if(Inc::StringToMessage(vecData[i], Msg) != Inc::SOK)
                    continue;
                //Add the socket to the sender information
                Msg.Sender.sock = vecSocks[dwResult];
                //Evaluate and delegate data and task
                EvaluateMessage(Msg);
            }
        }
    }
}

最佳答案

不要重新发明轮子,使用Boost.ASIO。它利用不同操作系统的内核特定功能进行了很好的优化,并设计了使客户端代码体系结构简单的方式。有很多示例和文档,所以您不会出错。

关于c++ - “主”循环的聊天服务器设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3660909/

10-12 00:10