2013-05-16 29 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