gpt4 book ai didi

c++ - "main"循环的聊天服务器设计

转载 作者:行者123 更新时间:2023-11-28 08:27:02 25 4
gpt4 key购买 nike

我正在一个小型 tcp 聊天服务器上编写,但我遇到了一些我无法弄清楚如何“优雅”解决的问题。

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

但是正如大家所看到的:这种方法真的很糟糕......我想不出如何更好地完成这一切,获取连接套接字,创建单个连接等等:/......

有什么建议、改进等吗?...

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++ - "main"循环的聊天服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3660909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com