我有一个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