RecvBuffer
이 부분을 잘못 이해하고 있는거 같습니다.
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가 둘다 예라면 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대 요소를 넘겨줬으니 해당 메모리 영역을 참조하겠죠.
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





