클라이언트와 서버가 소켓 통신으로 연결되는 초기 코드를 우선 작성하려 한다.
[ ] 클라이언트에서 접속할 서버의 정보와 같은 meta 정보를 기록하는 meta data config 페이지 필요
.config?
[ ]
[ ] 통신을 담당하는 NetworkManager Class
while (isRunning)
코드 내부에서 계속 실행될 수 있도록 구현[ ]
window에서 socket 프로그래밍을 하기 위해서는 **WSA(Window Socket API)**를 이해해야 한다. WSAStartup(), WSACleanup() 함수를 사용하면 소켓 API를 쓸 수 있다.
소켓은 PORT에 바인딩 된다. 서버는 최소 1개의 PORT에 바인딩 할텐데, 클라이언트는 N명이 접속할 것이다. 그러면 클라이언트가 Hello 하고 접속할 때에는 서버의 PORT로 요청할거고, 그러면 하나의 PORT로 여러 개의 소켓이 생성된다는 말이다. 그러면 서버에서는 N개의 소켓이 생성되고 이 정보만 있으면 클라이언트를 특정할 수 있는 걸까??
→ UDP라면 accept도 없이 바로 send/recv 과정을 거치는데, recv 함수의 인자로 remote 정보를 전달하고 얻게 되기에 이걸 이용한다. TCP라면 accept의 return으로 remote의 정보도 포함된 send/recv용 소켓이 만들어진다. 이걸 이용해 통신한다. 하나의 PORT는 채널일 뿐, 이 PORT를 하나의 소켓이 점유하는 게 아니다!
아래의 코드에서 소멸자를 private으로 선언했더니, GetInstance() 메서드에서 컴파일 에러 발생했다.
함수가 참조형을 반환하지만 값을 받을 때에 참조가 아닌 대입으로 리턴을 받아서 임시값이 전달되어 라인이 끝나면서 소멸자가 호출되어야 하는 상황인 것 같다. 그런데 소멸자가 private으로 되어 있으니 바깥에서 소멸자를 호출할 수 없어 발생하는 에러인 것 같다.
NetworkManager class 같은 싱글턴 객체는 전체 프로세스가 도는 동안 제거되면 안되기에, 소멸자도 private으로 보내두면 좋은 것 같다. 그러면 외부에서 실수로든 delete를 할 수 없다.
아래 같은 테스트도 해보았는데, 참조로 받았을 때 참조자의 수명이 끝나면 가리키던 객체에서 소멸자가 호출되는지??
출력 결과를 보면 참조하던 참조자의 수명이 끝난다고해서 소멸자가 호출되지 않는다는 걸 알 수 있다. 싱글턴에서 소멸자까지 private으로 넣고 참조자로 받으면 안전하게 사용 가능할 것 같다.