인프런 커뮤니티 질문&답변

한종훈님의 프로필 이미지
한종훈

작성한 질문수

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

JobQueue #2

Listener 관련 질문

작성

·

263

0

강의 내 1:45초쯤 더 많은 손님을 받을수 있도록 Listener에 for문을 추가하였습니다.

RegisterAccept -> (socket.AcceptAsync) -> OnAcceptCompleted -> RegisterAccept로 이어지는 loop가 10개 생성되었다고 이해했습니다.

그렇다면 하나의 ListenSocket에 10개의 loop가 묶여있는 상태에서 client로부터 온 소켓들이 어떻게 하나씩 배치될수 있나요?  다른 loop에 같은 소켓이 배치될수도 있을것 같은데 아무리 생각해도 이 부분이 이해가 잘 안가서 질문드립니다.

강의 잘 수강하고 있습니다. 감사합니다.

답변 2

0

한종훈님의 프로필 이미지
한종훈
질문자

답변 감사합니다

혹시라도 운이 없어서 하나의 물고기에 2개 이상의 낚시대가 반응 (args.completed 이벤트 발생)할수도 있다고 생각했는데 그러한 일이 발생할수도 있나요? 

Rookiss님의 프로필 이미지
Rookiss
지식공유자

그럴 순 없습니다!

한종훈님의 프로필 이미지
한종훈
질문자

감사합니다

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

애당초 클라에 배치되는건 listenSocket이 아니고, 별도로 소켓을 만들어줍니다.
listenSocket은 정말로 문지기의 영업용 휴대폰 같은 개념이고 손님들과는 무관합니다.

한종훈님의 프로필 이미지
한종훈
질문자

답변 감사합니다

수업중

SocketAsyncEventArgs args = new SocketAsyncEventArgs();

args.Completed += new EventHandler<SocketAsyncEventArgs>                                                        (OnAcceptCompleted);

RegisterAccept(args);

에서 for문을 추가하여 

for (int i = 0; i < register; i++)

{

SocketAsyncEventArgs args = new SocketAsyncEventArgs();

args.Completed += new EventHandler<SocketAsyncEventArgs>                                                        (OnAcceptCompleted);

RegisterAccept(args);

}

으로 Listener가 더 많은 손님을 받을수 있도록 변경하셨다고 하였는데 이부분이 잘 이해가 되지 않습니다. 

감사합니다

 

Rookiss님의 프로필 이미지
Rookiss
지식공유자

RegisterAccept 코드에서 실제로 Accept 비동기 코드를 실행하는데,
1번 호출했으면 1번 손님을 받고 끝나는겁니다. (다시 Register하기 전까진)
낚시에 비유하면 낚시대가 1개라면 물고기도 한 번에 딱 한마리만 낚을 수 있겠죠?
그리고 물고기를 끌어올린 다음에 다시 낚시대를 던져서 낚시를 이어나가게 될겁니다.
for문으로 SocketEventArgs를 여러개 만들어 Register를 다수 실행하는 것은
마치 낚시대를 10개 동시에 물에 넣는 것과 유사합니다.

한종훈님의 프로필 이미지
한종훈

작성한 질문수

질문하기