강의

멘토링

커뮤니티

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

작성자 없음

작성자 정보가 삭제된 글입니다.

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

Session #1

AcceptAsync 이후 pending 관련

작성

·

505

0

void RegisterAccept(SocketAsyncEventArgs args)

        {

            args.AcceptSocket = null;

            bool pending = _listenSocket.AcceptAsync(args);

            if (!pending)

            {

                OnACceptCompleted(null, args);

            }

        }

 

위 Function에서 보면  pending == false 인경우 OnACceptCompleted 함수를 바로 실행시키는데요

 

init 함수에서

SocketAsyncEventArgs args = new SocketAsyncEventArgs();

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

            RegisterAccept(args);

 

위와같이 args.Completed에 OnACceptCompleted를 등록해 주었기 때문에 펜딩이 안되어 바로 Accept가 된 상황에서도 등록한 이벤트로 인해 OnACceptCompleted 가 실행되는것 아닌가요?

if (pending == false)

            {

                OnACceptCompleted(null, args);

            }

 

이 코드는 불필요 한게 아닌가 궁금합니다.

실제로 로그를 찍어보면 서버가 AcceptAsync를 하는 시점과 클라이언트가 접속하는 시간 차이가 있어서 pending이 항상 true로찍혔고 그래서 pending이 false일때에 대한 상황은 재현하지 못했습니다.

답변 1

0

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

안녕하세요
모든 수강생들에게 드리는 말씀이지만,
우리가 만든게 아닌 외부 함수는 꼭 MSDN 문서를 살펴보는 습관을 들여야 합니다.
구글에서 AcceptAsync를 쳐보면 자세한 스펙에 대해 MS에서 정리를 해놨는데요.

https://docs.microsoft.com/ko-kr/dotnet/api/system.net.sockets.socket.acceptasync?view=net-6.0

작업이 동기적으로 완료된 경우 (false),
Completed이 이벤트가 호출되지 않는다는 점을 알 수 있습니다.
따라서 이 경우 우리가 직접 호출해야 합니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기