如何使用结构擦除地图中的值?[C++]

How to erase values in a map with a struct? [C++]

本文关键字:C++ 何使用 结构 擦除 地图      更新时间:2023-10-16

我在一个小的TCP客户端-服务器中工作,我使用带有结构的"map"来存储客户端跟踪号他的IP和他的套接字。主要问题是,当我想从"地图"中删除他的数据(连接已关闭)时,它确实如此,但是当涉及到 2 个或更多客户端时,服务器似乎出现了滞后,后来,当 1 个或多个客户端关闭他的连接时,服务器应用程序停止响应(但接受连接)......也许停在一个无限循环中?无论如何。。。这是我的代码:

//------------------------------
//--------------- main.h
struct ClientData{
    int sock;
    char IP [65];
};
class ServerNetwork
{
public:
    map<int, ClientData> MapClient;
...

//------------------------------
//--------------- ServerNetwork.cpp
void ServerNetwork::SendToAll(char * packets, int totalSize)
{
    SOCKET currentSocket;
    map<int, ClientData>::iterator iter;
    int iSendResult;
    if (MapClient.empty()){
        return;
    }
    for (iter = MapClient.begin(); iter != MapClient.end(); iter++ )
    {
        int currentID = iter->first;
        currentSocket = iter->second.sock;
        iSendResult = SendInfo(currentSocket, packets, totalSize);
        if (iSendResult == SOCKET_ERROR)
        {
            closesocket(currentSocket);
            printf("Closed Connection from Client # %dn", currentID);
            RemoveClient(currentID);
            iter = sessions.begin();
            iter++;
            break;
        }
        iter++;
    }
}
void ServerNetwork::RemoveClient(int ClientID)
{
    MapClient.erase(ClientID);
    printf("Deleted!n");
}

MapClient 持有客户端 ID+(ClientSock&ClientIP)我正在使用VisualStudio 2013。

谢谢!

你应该真正利用 Map::erase 在擦除后返回下一个迭代器的事实。因此,将擦除重构为删除客户端是一个坏主意。

iter=MapClient.begin()
while(iter != MapClient.end()
{
   ....
   if(...)
   {       
      closesocket(currentSocket);
      printf...
      iter = MapClient.erase(iter);
      continue; //do this to avoid the iter++ below
   }
   iter++;    
}