2014-06-05 4 views
0

완벽하게 작동하는 서버를 만들었습니다. 그러나 DDoS 공격에 대해 테스트하기로 결정했을 때 주요 메모리 누수가 발견되었습니다. 아래의 코드는 RAM을 채우고 (DDoS 때) 결국 컴퓨터가 다운됩니다. 나는 메모리 누수가 여전히 존재하지만 대응책을 구현하려고했습니다. 현재 듣고있는 코드는 다음과 같습니다.TcpClient 메모리 누수

TcpClient connection = server.AcceptTcpClient(); 
if (!IpByConnection.ContainsKey(connection.Client.RemoteEndPoint.ToString().Split(':')[0])) { 

    IpByConnection.Add(connection.Client.RemoteEndPoint.ToString().Split(':')[0], connection); 

    CipherNetwork network = new CipherNetwork(connection); 
    network.ListenOnDifferentThread(true); 
    network.DisconnectOnError(true); 
    network.StartListening(); 

    TotalConnections += 1; 

} else { 
    connection.Close(); 
} 

이 메모리 누수는 어떻게 수정합니까?

편집 : 언급하는 것을 잊어 버렸습니다.이 메서드는 별도의 스레드에서 실행됩니다.
EDIT 2 : null로 설정하려고했는데 둘 다 삭제했습니다.

+1

질문이 있으십니까? – phoog

+0

게시물을 편집하여 질문을 추가했습니다. – Brodie

+0

BTW. 문제와 관련이 없지만 IPV6 주소를 가진 사람이 연결되어 있으면 서비스가 실패합니다. –

답변

0

직접 솔루션을 찾을 수 없지만 IP 당 각 연결을 5 개로 제한하고 A 사전을 사용하여 연결된 사용자를 저장하고 연결이 끊어진 경우 제거 할 수있었습니다.

0

IpByConnection에서 연결을 제거하지 마십시오. 목록에있는 연결이 커지면 연결이 끊어 지거나 닫히는 방식이 해당 컬렉션에서 제거되어야합니다. 이것은 DDoS 공격과 관련이 없으며, 같은 이유로 다시 시작하지 않고 약한/개월 후에도 동일한 이유로 프로그램이 중단 될 수 있습니다.

이러한 개체를 제거하는 방법은 해당 연결을 사용하여 작업을 완료 한 시점을 결정하기 위해 해당 연결로 수행하는 작업에 따라 다릅니다.

+0

코드를 디버깅했습니다. 연결을 한 번 추가 한 다음 if 문이 연결을 다시 추가하는 것을 중지합니다. hastable은 1의 수에 남아 있습니다. – Brodie

+1

@Brodie 예, 문제는 반복해서 반복되는 동일한 연결이 아닙니다. 문제는 2 백만 개의 *** IP가 서로 연결되면 (DDoS 공격에서 일어날 것입니다), 프로그램은 2 백만 개의 개체를 'HastSet'에 가지고있을 것이고, 제거 할 객체. 그리고 그들이 해시 집합에있는 경우 'null'로 설정하고 가비지 수집 중에는 객체가 컬렉션에 의해 "루팅"되므로 가비지 수집 중에 제거 할 수 없으므로 아무것도 수행하지 않습니다. –

+0

나는 그것이 다른 문제이지만 지금은 127.0.0.1에서 비롯된 것임을 알고 있으며,이 문제의 원인을 알고 싶습니다. 나는 당신의 요점을보고, 나는 왜 이것이 동일한 IP에서 누출되고 있는지 일단 이해하면 해결책을 찾는다. 그리고 HashTable에 지속적으로 추가하지 않는 곳. – Brodie