반사된 메세지 recv하였을 때의 순서 동일한 이유
624
작성한 질문수 17
안녕하세요, 강사님!
GameRoom에서 client -> server로 보낸 메세지를 다른 client들에게 broadcasting을 하는데, 그래서 출력 결과가 10개씩 나오는 이유가
10개의 클라이언트들이 보낸걸 다시 반환하는것이기 때문에.
즉, 반사가 10개씩 나오는거고, 근데 클라이언트 console창이 하나로만 되어있다보니 10개의 클라이언트가 받은 반사메세지가 한번에 출력되어 10개씩 출력되는 것이라고 이해를 했습니다.
그런데 각 session이 어떤 순서로 반사를 받는지 궁금하여 client의 serversession에도 sessionid를 부여하고 테스트로 출력을 해 본 결과 아래와 같았습니다.

session이 send 를 하는 것은 async로 구현하였기 때문에 비동기방식인데, 저렇게 규칙적으로 받아오더라구요.(4 2 3 1 5 0 6 7 8 9 ...순서)
Program.Room.Enter(this); 를 한 순서대로 GameRoom의 _sessions 리스트에 추가가되니 Broadcast 때 리스트를 foreach하니까 리스트에 추가된 순서대로 오는 것 같다고 생각이 드는데, 사실 네트워크 상태에 따라서 패킷이 라우터에 경로가 달라지니 각기 다른 순서로 올 수도 있고(이건 그렇게 부하가 큰편은 아니니 그래도 해당 원인은 무시한다고 쳐도), 멀티스레드이기도 하고 thread context switching 으로 인해 스레드간 순서가 마구마구 뒤바뀔거라 예상을 했지만, 저렇게 규칙적으로 나오는 이유가 무엇인지 궁금합니다.
그리고 새로 실행 시 마다 저 규칙이 변경이 되는데, 그 이유는 사실Listener에서 Onconnected를 하여 Program.Room.Enter(this); 안에 들어가는 순서가 멀티스레딩이라서 다르게 들어가기 때문이라고 이해를 했습니다. 그렇다면 멀티스레딩으로 인한 순서 뒤바뀜이 있다는 증거이고 사실 listener가 받는 것 또 한 GameRoom에서 broadcasting하는것과 비슷하게
lock을 걸고 순서대로 session list에 추가하고
즉, 순차적으로 여기서 리스트 순서대로 보내도 순서뒤바뀜이 일어나서 GameRoom에서의 List에 쌓이는 순서도 바뀌는거라고 생각이 들거든요.
그러면 SendForEach에서 ServerSession리스트를 보낼 땐 멀티스레드로 인해서 순서가 뒤바뀌는데, Server의 GameRoom에서 ClientSession 리스트를 뽑아 send할 땐 순서가 유지되어 send보내지는 이유는 뭔가요?
답변 1
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





