2017-04-24 53 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,它应该使用信号量而不是整数,但希望这会给你一个总体图片。