inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Listener

RegisterAccept 호출

해결된 질문

383

bbd

작성한 질문수 11

3

public void RegisterAccept(SocketAsyncEventArgs args)

        {

            // event 재사용시 null로 밀어두자.

            args.AcceptSocket = null;

            bool pending = listenSocket.AcceptAsync(args);

            if (pending == false)

                OnAcceptCompleted(null, args);

        }

해당 함수가 처음에 pending == true로 인해 

OnAcceptCompleted 함수를 호출하지 못하는데

어떻게 다시 RegisterAccept 함수가 호출되나요?

SocketAsyncEventArgs 콜백 체인을 걸어두면 accept 가능할 때 OnAcceptCompleted를 호출하는건가요?

network unity C#

답변 4

5

Rookiss

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.acceptasync?view=netcore-3.1

Returns

Boolean

true if the I/O operation is pending. The Completed event on the e parameter will be raised upon completion of the operation.

false if the I/O operation completed synchronously. The Completed event on the e parameter will not be raised and the e object passed as a parameter may be examined immediately after the method call returns to retrieve the result of the operation.

API 관련된 부분은 공식 문서를 참고하시는게 좋습니다.
요약하면 true가 반환될 경우,
IO 요청이 pending 상태라서 아직 실행되지 않은 상태이고,
나~중에 완료가 되면 콜백으로 걸어준 e가 자동으로 실행됩니다.
false가 반환될 경우, 콜백 e가 자동 호출되지 않으니 우리가 직접 호출해야 합니다.

어떤 언어/환경이라도 Async 비동기 함수를 호출하면
1) 폴링 방식으로 우리가 주기적으로 완료 여부를 체크;
2) 완료되면 걸어준 콜백 함수가 실행됨;

위의 2가지 중 하나로 구현을 하게 되는데,
C#에서는 다 2번으로 간다고 보시면 됩니다.

4

Rookiss

registerAccept와 OnAcceptCompleted가 계속 서로를 호출하는 이유
이게 Recv나 Accept나 반복해서 나오는 패턴이라 매우 중요한데
낚시에 비유하면 registerAccept는 낚시대를 바다에 던지는 행위이고,
OnAcceptCompleted는 물고기를 잡아 끌어올리고, 물고기를 보관통에 넣는 행위입니다.
물고기를 잡아서 낚시대에서 떼어냈으면,
다시 낚시대를 바다에 던져야 다음 낚시를 시작할 수 있겠죠.
(그렇지 않으면 한 번 낚고 영영 끝날겁니다)

1

bbd

이해했습니다. 저는 pending이 false이면 어떤 세션도 아직 connect 되지 않은 상태라고 생각했었는데

true일 때가 그런거였고 false인 경우는 connect에 대한 처리를 바로 할 수 있는 상태였군요

registerAccept와 OnAcceptCompleted가 계속 서로를 호출하는 이유는 기존의 무한루프에서의 구문이

스레드가 분기되어 처리가 되니 while문을 대체했다고 보면 되는걸까요?

0

bbd

친절한 답변 정말 감사드립니다!

TLS 질문드립니다.

0

40

2

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

0

46

2

Unity Span

0

75

2

XML, Dll 차이점

0

103

2

Session 질문입니다

0

78

1

Write Read 커서 키워드

0

72

1

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

0

69

2

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

0

97

2

UnhandledException 으로 서버 터지는 경우

0

84

2

컨텐츠 단, 엔진 단

0

103

1

질문 있습니다

0

76

2

C# 게임서버 3D MMORPG

0

143

2

유니티6 버전

0

96

2

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

0

132

2

커서의 위치의 중요성

0

102

2

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

0

169

2

강의에 질문이 있습니다

0

85

2

멀티스레드 이해도 질문

0

94

1

500 vs 500

0

127

3

OnAcceptHandler 액션 함수

0

60

1

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

0

187

2

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

0

81

2

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

0

104

1

스핀락 질문.

0

109

2