inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

RecvBuffer

해결된 질문

523

wlfansdl

작성한 질문수 32

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로 따라가는 것으로는 잘 안보이네요..

network C# unity

답변 1

1

Rookiss

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

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

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

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

0

wlfansdl

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

0

Rookiss

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

TLS 질문드립니다.

0

57

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

57

2

Unity Span

0

82

2

XML, Dll 차이점

0

111

2

Session 질문입니다

0

84

1

Write Read 커서 키워드

0

79

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

76

2

네트워크 Send 전담 스레드 배치

0

100

2

UnhandledException 으로 서버 터지는 경우

0

91

2

컨텐츠 단, 엔진 단

0

108

1

질문 있습니다

0

78

2

C# 게임서버 3D MMORPG

0

153

2

유니티6 버전

0

100

2

receive하는 부분과 send하는 부분의 차이

0

135

2

커서의 위치의 중요성

0

105

2

C++ 전혀 모르는데 C# 서버

0

171

2

강의에 질문이 있습니다

0

89

2

멀티스레드 이해도 질문

0

98

1

500 vs 500

0

132

3

OnAcceptHandler 액션 함수

0

64

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

194

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

84

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

107

1

스핀락 질문.

0

111

2