2017-04-24 4 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 실행해야합니다 그리고 그것은 ints가 아닌 Semaphores를 사용해야합니다.하지만 잘하면 이것이 일반적인 그림을 줄 것입니다.

관련 문제