我有一個C#服務器應用程序,它提供基於數據包的服務。 例如:客戶端連接,發送一個名爲「do X action」的數據包,服務器詳細說明這樣的數據包。C#根據數據包計數數據包
問題是,人們可以使用WPE或數據包管理器將請求氾濫到服務器,並且每秒發送多達1000個數據包,這顯然會導致服務器崩潰。
有人能給我一個想法,關於如何實際上我可以保持包數,也許基於IP或會話? 例如:每秒超過30個數據包,服務器將斷開客戶端連接。
這可能嗎?
我有一個C#服務器應用程序,它提供基於數據包的服務。 例如:客戶端連接,發送一個名爲「do X action」的數據包,服務器詳細說明這樣的數據包。C#根據數據包計數數據包
問題是,人們可以使用WPE或數據包管理器將請求氾濫到服務器,並且每秒發送多達1000個數據包,這顯然會導致服務器崩潰。
有人能給我一個想法,關於如何實際上我可以保持包數,也許基於IP或會話? 例如:每秒超過30個數據包,服務器將斷開客戶端連接。
這可能嗎?
您將在服務器端每個連接有1 TcpClient
。如果您在TcpClient的底層NetworkStream上調用Read()
,並且您獲得大量千字節(TCP將不保留數據包結構,只有UDP會),您可以想象出現問題,然後斷開並記住IP以過濾進一步的連接要求。
如何在您已經解碼的流進命令的時候,你只是停止處理他們,當你達到一定的量的進展:
static int commandsInProcessing = 0;
void CommandReceived()
{
while(commandsInProcessing >= 30)
{
Sleep(100);
}
commandsInProcessing++;
ProcessCommand();
commandsInProcessing--;
}
很顯然,你需要運行的線程內CommandReceived,它應該使用信號量而不是整數,但希望這會給你一個總體圖片。
答案是肯定的,但就目前而言,這個問題太廣泛而不能簡明回答。假設您已經編寫了一些可以實現數據包的代碼,您應該考慮發佈一些代碼,以便我們可以更精確地幫助您。 – aevitas