• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

AcceptAsync 이후 pending 관련

22.02.28 15:24 작성 조회수 357

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

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

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

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