IOCP服务端项目,已实现大部分功能,现在卡在安全层一直有疑问,项目中用WSAAccept接收client连接,代码设计如下:typedef struct {
SOCKET cs;
std::string address;
bool IsBanned;
} ClientSocket;typedef struct {
std::string address;
int connections;
} ClientConn;2个结构体分别保存了Client的socket/对应ip/是否被Ban、对应ip/连接数。fd = ::WSAAccept(lsfd, (struct sockaddr *)&addr, &addrlen, ConnectAcceptCondition,0);在回调ConnectAcceptCondition中对Ban/连接次数做了限制:1、如果Client是正常连接(没有被Ban/没有超出服务端设定的单IP最大连接数),则记录ClientConn,connections++(stl::map)
2、如果Client不是正常连接(被Ban/超出最大连接数),直接CF_REJECT
3、启用定时检测线程,由于Client连接信息分别由2个map保存,所以需要分别迭代一次while (1)
{
    ...
    time_t t;
    for (mSocketIter=ClientSocketList.begin();mSocketIter!=ClientSocketList.end();)
    {
       t = time(NULL);       // 如果client被ban 或 最后通讯时间超过IdleTime
       // kick this client
       if (mSocketIter->first->cs && (mSocketIter->first->IsBanned) || (t - mSocketIter->second > IdleTime)))
       {
          shutdown(mSocketIter->first->cs);
          closesocket(mSocketIter->first->cs);
       }
       else
       {
            ...
       }
    }
    ...
    Sleep(xxx);
}现在问题是:由于Client信息分了2个map保存,而在WSAAccept的ConnectAcceptCondition中又无法保存当前连接的socket,请问:
是否应该在WSAAccept成功接受连接后再保存socket到map,因为允许客户端从同一IP上多次连接server,所以没办法把socket信息和connections信息整合到一个map中.