你如何使用winsock限制每个IP的连接?
假设我想将它们限制为每个 IP 20 个连接,然后一旦达到限制就不要接受连接。
我想不出这样做的逻辑。
在接受连接之前,我曾考虑过callbacks
在WSAAccept()
每个 ip 上使用并登录到数据库,并在数据库中为每个建立的连接列出它。
[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;
但是有没有更有效的方法来做到这一点?
你如何使用winsock限制每个IP的连接?
假设我想将它们限制为每个 IP 20 个连接,然后一旦达到限制就不要接受连接。
我想不出这样做的逻辑。
在接受连接之前,我曾考虑过callbacks
在WSAAccept()
每个 ip 上使用并登录到数据库,并在数据库中为每个建立的连接列出它。
[check if column count is <= 20]
return CF_ACCEPT;
}else{
return CF_REJECT;
但是有没有更有效的方法来做到这一点?
我不会为此使用数据库。一个简单的内存查找表就足够了,例如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;
}