C#基于源计数数据包

时间:2017-04-24 19:56:44

标签: c# packets

我有一个C#服务器应用程序,它提供基于数据包的服务。 例如:客户端连接,发送名为"执行X操作"的数据包,服务器详细说明此类数据包。

问题是,人们可以使用WPE或数据包管理器向服务器发送请求并每秒发送多达1000个数据包,这显然会导致服务器崩溃。

有人可以给我一个想法,实际上我可以保持数据包计数,可能基于IP或会话? 例如:每秒超过30个数据包,服务器断开客户端连接。

这可能吗?

2 个答案:

答案 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而不是整数,但希望这会给你一般的图片。