使用winsock限制每个ip的连接数

时间:2013-05-16 08:58:54

标签: c++ sockets ip winsockets

如何使用winsock限制每个IP的连接?
假设我想将它们限制为每个IP 20个连接,然后一旦达到限制就不接受连接。

我无法想到这样做的逻辑。

我曾考虑在callbacks上使用WSAAccept()并在接受连接之前登录每个ip的数据库,并在db上为每个连接列出它。

[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;

但是有更有效的方法吗?

1 个答案:

答案 0 :(得分:0)

我不会为此使用数据库。一个简单的内存中查找表就足够了,例如std::map。但总的来说,使用WSAAccept()回调你是在正确的轨道上。唯一的另一种选择是接受连接,然后在需要时立即关闭它。

更新:使用std::map

的示例
#include <map>

std::map<ulong, int> ipaddrs;
...

// when a client connects...
ulong ip = ...;
int &count = ipaddrs[ip];
if (count < 20)
{
    ++count;
    return CF_ACCEPT;
}
else
{
    return CF_REJECT;
}

...


// when an accepted client disconnects...
ulong ip = ...;
int &count = ipaddrs[ip];
if (count > 0)
{
    --count;
}