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中.
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中.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货