• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

RegisterAccept 호출

20.10.27 22:34 작성 조회수 270

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를 호출하는건가요?

답변 4

·

답변을 작성해보세요.

5

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

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

1

bbd님의 프로필

bbd

질문자

2020.10.28

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

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

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

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

0

bbd님의 프로필

bbd

질문자

2020.10.28

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