• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

RecvBuffer

22.03.07 23:52 작성 조회수 425

0

안녕하세요, 진도 열심히 빼다가 버퍼랑 패킷 부분에서 막혀서 다시 복습중입니다.
이 부분을 잘못 이해하고 있는거 같습니다.
RecvBuff _recvBuff = new RecvBuff(1024);
        
// 코드들 중략

void RegisterRecv()
        {
            _recvBuff.Clean();  
            // 질문1. 여기서 segment에 들어오는 값은 WriteSegment가 새로 할당한 값복사가 맞나요 ? 
            //( 호출 당시 멤버변수 _recvBuff 값은 가지고 있지만 원본과 상관없는 )
            // 그렇게 생각한 이유 : ArraySement가 구조체이고 new를 했기때문에
            ArraySegment<byte> segment = _recvBuff.WriteSegment;
            
            // 질문2. MSDN을 읽어보니 SetBuffer 특정 메모리를 참조한다고 쓰여져 있는데요.. 그
            // 그러면 여기서 참조하는 메모리가 이 안에 지역변수로 선언된 segment를 의미하나요 ? 즉 지역변수 메모리 주소를 가르키나요 ?
            // 생각한이유, MSDN SetBuffer설명 : 비동기 소켓 메서드를 사용하여 버퍼로 사용할 메모리 영역을 설정합니다.
            _recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);

            bool pending = _socket.ReceiveAsync(_recvArgs);
            if (pending == false)
                OnRecvCompletetd(null, _recvArgs);
        }

// 세션 코드 끝, RecvBuff 코드
// 코드 중략
        public ArraySegment<byte> WriteSegment
        {
            get { return new ArraySegment<byte>(_buffer.Array, _buffer.Offset + _writePos, FreeSize); }
        }
 
코드 안에 주석으로 질문1, 질문2를 써놨습니다 !!!

따라서 만약에 질문 1, 2가 둘다 예라면 pending이 true나 false이든 함수를 나가면
Setbuffer가 참조하던 지역변수 segment는 없어지는 것 아닌가요 ..?
비동기가 완료되었을 때 어떻게 _recvBuff 안으로 값이 들어가는지 이해가 안되는거 같습니다 ㅠㅠ.

+) 추가적으로 이런 환경에서 디버그 팁이 있을까요 ?
코드흐름 좀 보고싶은데 비동기에 2개씩 실행되고 하니깐 단순히 메인부터 F11로 따라가는 것으로는 잘 안보이네요..

답변 1

답변을 작성해보세요.

1

// 질문1. 여기서 segment에 들어오는 값은 WriteSegment가 새로 할당한 값복사가 맞나요 ? 

ArraySegment는 단순히 특정 영역을 '가리키는' 혹은 '찝어주는' 역할을 합니다.
절대 무엇인가 복사를 하는 개념이 아닙니다.
C++이라면 포인터가 있으니 원하는 메모리 영역을 가리킬 수 있지만, 
C#에서는 정상적인 방법으론 포인터 사용이 되지 않으므로,
메모리 영역을 ArraySegment의 3대 요소
(배열 시작위치 array, 데이터 시작 오프셋 offset, 데이터 크기 count)로 잡아주는거죠.
만약 포인터를 사용할 수 있었으면 array+offset 을 합쳐서 포인터로 표현할 수 있었을겁니다.

// 질문2. MSDN을 읽어보니 SetBuffer 특정 메모리를 참조한다고 쓰여져 있는데요.. 그

여러가지 버전이 있지만, 우리가 넘겨준 버전에서는
역시나 3대 요소를 넘겨줬으니 해당 메모리 영역을 참조하겠죠.

wlfansdl님의 프로필

wlfansdl

질문자

2022.03.08

아하 빠른 답변 감사합니다..왜인지 구조체가 new하면 값복사가 이루어진다고 생각하고 있어서 헷갈렸네요 검색해보니 비슷한 질문이 있었네요

네 ArraySegment 구조체 자체는 복사이지만, 
ArraySegment가 들고 있는 array가 참조타입입니다.