我有一个C#服务器应用程序,它提供基于数据包的服务。 例如:客户端连接,发送名为"执行X操作"的数据包,服务器详细说明此类数据包。
问题是,人们可以使用WPE或数据包管理器向服务器发送请求并每秒发送多达1000个数据包,这显然会导致服务器崩溃。
有人可以给我一个想法,实际上我可以保持数据包计数,可能基于IP或会话? 例如:每秒超过30个数据包,服务器断开客户端连接。
这可能吗?
答案 0 :(得分:0)
服务器端每个连接有1 TcpClient
个。如果你在TcpClient的底层NetworkStream上调用Read()
并且你得到很多千字节(TCP不会保留数据包结构,只有UDP会),你可以想象有什么不对,然后断开连接并记住IP到过滤进一步的传入连接请求。
答案 1 :(得分:0)
在将流解码为命令时,您只需在达到一定数量的流程时停止处理它们:
static int commandsInProcessing = 0;
void CommandReceived()
{
while(commandsInProcessing >= 30)
{
Sleep(100);
}
commandsInProcessing++;
ProcessCommand();
commandsInProcessing--;
}
显然,你需要在线程中运行CommandReceived,并且它应该使用Semaphores而不是整数,但希望这会给你一般的图片。