2013-05-16 27 views
0

如何限制每个IP与winsock的连接?
比方说,我想限制他们每IP的20个连接,然后不接受连接,一旦达到极限。通过winsock限制每个IP的连接

我不能想到这样做的逻辑。

我想过在WSAAccept()上使用callbacks,并在接受连接之前在每个ip中登录数据库,并将其列在每个连接所做的db数据库中。

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

但是有没有更有效的方法呢?

回答

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; 
} 
+0

如何'map'这里工作?这是我第一次听说过这个功能。 – zikdaljin

+0

['std :: map'](http://en.cppreference.com/w/cpp/container/map)不是函数,它是一个包含键/值对的类。您可以使用IP地址作为密钥并使用“int”计数器作为值。当客户端被接受时,将它的IP放在'std :: map'中(如果它不存在),然后增加它的计数器。当客户端断开连接时,递减其IP计数器,并在计数器下降到0时将其从'std :: map'中移除。 –

+0

我可以看到示例用法先生吗? – zikdaljin