본문 바로가기
학습 노트/개인학습

250515 목요일 @ 18일차

by 삼색먕 2025. 5. 16.

 

오전엔 운영체제 7,8,9 장을 훑어보고

WSASend마무리
Client를 만들어야하는데 유니티로 또 시간 쏟기 싫어서
C#연습도 할겸 DummyClient확장도 할수있으니  간단하게 C#으로 제작하였다
C#은 뭐가 그렇게 변수가 별로 없는데도 알아서 착착 해주는지 모르겠다..

namespace DummyClient
{
    class Program
    {
        public static void Main(string[] args)
        {

            TcpClient tcpClient = new TcpClient();
            try
            {
                tcpClient.Connect("127.0.0.1", 7777);
                Console.WriteLine("서버에 연결 되었습니다.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"서버 연결 실패 : {ex.Message}");
            }

            Console.WriteLine("서버에 보낼 메시지를 입력하세요. (exit 입력 시 종료)");
            NetworkStream stream = tcpClient.GetStream();
            while (true)
            {
                Console.Write("> ");
                string input = Console.ReadLine();
                //입력 없을시 다시처음부터
                if (string.IsNullOrEmpty(input)) 
                    continue;
                if (input.ToLower() == "exit")
                    break;

                //문자->바이트 배열
                byte[] buffer = Encoding.UTF8.GetBytes(input);

                //서버에 전송
                stream.Write(buffer, 0, buffer.Length);


                //에코받기
                byte[] readbuffer = new byte[1000];
                int transferredBytes = stream.Read(readbuffer);
                string echoMsg = Encoding.UTF8.GetString(readbuffer);

                Console.WriteLine($"서버에서 온 메세지 : {echoMsg} ({transferredBytes} bytes)");
            }

        }
    }
}

 

큰덩어리 main함수 에서 떼서구조묶기
IocpServer: WSA세팅/IOCP객체 관리/listener제어 (Shared_ptr사용)
Listener: accept용 socket 관리/accept된 클라이언트 iocp와연결/Client -> 클라이언트 소켓관리/accept용 Overlapped확장 구조체 관리 (Shared_ptr사용)
Client: 연결클라이언트 소켓관리/recive 버퍼 관리/recive overlapped확장 관리 (Shared_ptr사용)

++추가된 기능
ClientManager: 연결된 클라이언트 추적관리 (싱글톤 사용)
ObjectPool: 오브젝트 통합 풀링을 위한 템플릿/여러군데서 사용할수 있으니 락 필수
PoolManager: 오브젝트풀 Static으로 전역으로 관리하기 


//오늘의 용어
dangling pointer : 이미 해제된 메모리를 참조하고있는 포인터 (람다에서도 발생할수있으므로 shared_ptr로 넘겨주면 좋다)
RAII = Resource Acquisition Is Initialization 
  객체 초기화시 자원 획득이라는 말인데 Shared_ptr 이나 lock_guard와 같은 지역성이 있고 
  지역이 벗어났을때 자동 해제되는 특징을 가진 패턴이다
enable_shared_from_this: 쉐어드 포인터를 사용하는 객체에서 자기자신 This대신 shared_ptr로 받을수 있게하는 상속자

//앞으로 좀더 파봐야할것
Shared_ptr : 값을 부여할때 초기화를 어떻게 하느냐에 따라서 dangling pointer발생 할 여지가 있기 때문에 기존에 raw pointer를 사용할때보다 관리는 편하지만 제대로 모르고 사용하면 중복소유 수 있기 때문이다.
Ramda : 캡처에 따라서 값이 없을수도 있기 때문에 좀 더 익숙해질 필요 있다 (캡처 쪽을 좀더 파볼것) 


구조화가 되면 될수록 작업속도가 빨라지고 오히려 머리가 돌아가는느낌이었다.

 

구조화 완료후 통신이 되는것 확인했다.
슬슬 작업 계획을 짜서 기능별로 날짜 지정해서 진행해야할것같다.

'학습 노트 > 개인학습' 카테고리의 다른 글

250517 토요일 @ 20일차  (0) 2025.05.17
250516 금요일 @ 19일차  (0) 2025.05.17
250514 수요일 @ 17일차  (0) 2025.05.15
250513 화요일 @ 16일차  (0) 2025.05.14
250512 월요일 @ 15일차  (0) 2025.05.13

댓글