0

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

我想不出这样做的逻辑。

在接受连接之前,我曾考虑过callbacksWSAAccept()每个 ip 上使用并登录到数据库,并在数据库中为每个建立的连接列出它。

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

但是有没有更有效的方法来做到这一点?

4

1 回答 1

0

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

更新:使用 a 的示例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;
}
于 2013-05-16T14:17:43.067 回答