2017-04-24 54 views
0

我有一個C#服務器應用程序,它提供基於數據包的服務。 例如:客戶端連接,發送一個名爲「do X action」的數據包,服務器詳細說明這樣的數據包。C#根據數據包計數數據包

問題是,人們可以使用WPE或數據包管理器將請求氾濫到服務器,並且每秒發送多達1000個數據包,這顯然會導致服務器崩潰。

有人能給我一個想法,關於如何實際上我可以保持包數,也許基於IP或會話? 例如:每秒超過30個數據包,服務器將斷開客戶端連接。

這可能嗎?

+0

答案是肯定的,但就目前而言,這個問題太廣泛而不能簡明回答。假設您已經編寫了一些可以實現數據包的代碼,您應該考慮發佈一些代碼,以便我們可以更精確地幫助您。 – aevitas

回答

0

您將在服務器端每個連接有1 TcpClient。如果您在TcpClient的底層NetworkStream上調用Read(),並且您獲得大量千字節(TCP將不保留數據包結構,只有UDP會),您可以想象出現問題,然後斷開並記住IP以過濾進一步的連接要求。

0

如何在您已經解碼的流進命令的時候,你只是停止處理他們,當你達到一定的量的進展:

static int commandsInProcessing = 0; 
void CommandReceived() 
{ 
    while(commandsInProcessing >= 30) 
    { 
     Sleep(100); 
    } 

    commandsInProcessing++; 
    ProcessCommand(); 
    commandsInProcessing--; 
} 

很顯然,你需要運行的線程內CommandReceived,它應該使用信號量而不是整數,但希望這會給你一個總體圖片。