인프런 커뮤니티 질문&답변
RecvBuffer
해결된 질문
작성
·
513
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
Rookiss
지식공유자
// 질문1. 여기서 segment에 들어오는 값은 WriteSegment가 새로 할당한 값복사가 맞나요 ?
ArraySegment는 단순히 특정 영역을 '가리키는' 혹은 '찝어주는' 역할을 합니다.
절대 무엇인가 복사를 하는 개념이 아닙니다.
C++이라면 포인터가 있으니 원하는 메모리 영역을 가리킬 수 있지만,
C#에서는 정상적인 방법으론 포인터 사용이 되지 않으므로,
메모리 영역을 ArraySegment의 3대 요소
(배열 시작위치 array, 데이터 시작 오프셋 offset, 데이터 크기 count)로 잡아주는거죠.
만약 포인터를 사용할 수 있었으면 array+offset 을 합쳐서 포인터로 표현할 수 있었을겁니다.
// 질문2. MSDN을 읽어보니 SetBuffer 특정 메모리를 참조한다고 쓰여져 있는데요.. 그
여러가지 버전이 있지만, 우리가 넘겨준 버전에서는
역시나 3대 요소를 넘겨줬으니 해당 메모리 영역을 참조하겠죠.






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