Study/에러 정리

mfc - iocp 통신 메모리 누수

Juzdalua 2024. 12. 23. 11:47

상황

0. iocp 서버와 iocp 클라이언트는 각각 mfc 프로그램이다.

1.  iocp 서버는 tcp로 연결된 클라이언트가 존재하면 보유한 데이터를 브로드캐스팅한다.

2. iocp 서버에 연결된 클라이언트는 다음과 같다.

  • UE5
  • iocp client
  • nest.js server

3. iocp client에서는 데이터를 수신할 필요가 없다.

4. iocp client에는 iocp server에 필요한 데이터를 계속 송신한다.

5. 위와 같은 상황에서 iocp server의 메모리는 계속해서 증가하고, 정상 종료가 되지 않아 작업관리자에서 강제로 종료해야했다.


서버 프로그램이 정상 종료 되지 않는 상황은 다음과 같은 경우에도 발생했다.

1. 스레드가 정상 종료 되지 않은 경우

2. 동적 할당 메모리가 해제되지 않은 경우

3. 공유 포인터의 참조가 해제되지 않은 경우

 

위 문제들은 해결했지만, 계속해서 메모리 누수가 발생하고 있었다.

그리고 원인은 아래와 같았다.

 

1. 데이터를 송신만 하는 iocp client도 iocp server의 브로드캐스팅 데이터를 수신한다.

2. iocp client에 wsarecv 함수를 등록하지 않아, 정상적인 수신이 이루어지지 않는다.

3. iocp server는 tcp 프로토콜로, 수신되지 않은 데이터를 계속해서 전송을 시도한다.

 

해결방법은 아래와 같았다.

1. iocp client 프로그램에 wsarecv 함수를 등록한다.


추가로 진행해본 테스트는 아래와 같다.

1. 작업하는 스레드를 늘려본다.

2. 락으로 경합하는 큐의 상태도 확인한다.

3. nlohmann json의 dump 함수 실행시 발생하는 동적 메모리를 수동으로 해제한다.


생각하지 못했던 부분에서 메모리 누수가 발생했다.

mfc 프로그램을 만들어준 분께 여쭤보니 udp로 통신한다고 했었던 말이 생각나 수정을 진행했다.

 

4계층 tcp/ip 레이어에서 전송이 완료되면 ack 패킷을 보내는걸 잊고있었다.

서버에서 ack 패킷을 받지 못해 계속해서 전송하던 것이 원인이었다.

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C