• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

전체적인 알고리즘의 이해가 좀 어렵습니다..

21.07.16 02:04 작성 조회수 216

0

Listener 클래스에서

SocketAsyncEventArgs args = new SocketAsyncEventArgs();

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

1) 위의 두 줄의 코드가 정확히 어떤 것을 의미하는지 잘 모르겠습니다. args.Completed로 OnAcceptCompleted를 실행하고 RegisterAccept(args)도 또 실행해주는 건지..

2) 그리고 pending이 true일 경우에는 RegisterAccept를 빠져나온 다음  다시 Init함수를 실행하기 때문에 위의 두 줄의 코드를 실행할 수 있게 되는 것이 맞는 이해일까요?

3) 마지막으로 Async가 있는 코드는

bool pending = _listenSocket.AcceptAsync(args);

이 코드밖에 없어서 pending이 참인지 거짓인지 판별만 가능할텐데, 어떻게 Async 함수를 통해 비동기적인 실행을 할 수 있는 것인가요?

답변 1

답변을 작성해보세요.

2

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

1)
 위의 두 줄의 코드가 정확히 어떤 것을 의미하는지 잘 모르겠습니다. args.Completed로 OnAcceptCompleted를 실행하고 RegisterAccept(args)도 또 실행해주는 건지..

Completed는 delegate라서 그 부분부터 이해해야 하는데,
delegate/event 문법이 헷갈리시면 복습을 해보시기 바랍니다.
당장 new EventHandler는 무시하시고, 그냥 OnAcceptCompleted라는 함수를
Completed이라는 delegate에 연결시켜준다고 생각하시면 됩니다.

그러면 원하는 시점에 누군가가 Completed를 Invoke해서
우리가 지정한 함수(OnAcceptCompleted)를 호출해줄 수 있을테고
'원하는 시점에 거꾸로 호출해준다' 하여 이를 '콜백 함수'라고 합니다.

2) 그리고 pending이 true일 경우에는 RegisterAccept를 빠져나온 다음  다시 Init함수를 실행하기 때문에 위의 두 줄의 코드를 실행할 수 있게 되는 것이 맞는 이해일까요?
3) 마지막으로 Async가 있는 코드는
bool pending = _listenSocket.AcceptAsync(args);
이 코드밖에 없어서 pending이 참인지 거짓인지 판별만 가능할텐데, 어떻게 Async 함수를 통해 비동기적인 실행을 할 수 있는 것인가요?

2+3이 결국 같은 질문인데,
비동기 네트워크 입출력 함수의 결과를 통지 받는 방법은 크게 2개 있습니다.
1) 매번마다 계속 체크해서 완료 여부 체크
2) 완료 통지를 받는 함수를 지정해두고, 그것을 통해 받기

우리가 사용하는 방법은 2)번이고 OnAcceptCompleted를 연결시켜준 셈이죠.
그렇다고 해서 다시 Init 함수를 실행해서 두 줄의 코드가 실행되는건 아니고,

다른 누군가가 대신 호출해주고 있습니다.
그러면 실제로 그 부분을 누가 호출해줄까요?
바로 우리한테는 코드가 숨겨져 있는
C# (.NET) 프레임워크 내부에서 해주는 것입니다.

코드가 숨겨져 있으니 와닿지 않을 수 있겠지만
언젠가 C++ 코드로 작성해보면 이런 부분도 우리가 직접 챙겨야 합니다.
지금은 일단 완료 통지가 오면 우리가 지정한 함수를
쓰레드 풀에 있는 쓰레드 중 하나를 이용해 알아서 호출해준다 << 정도로만 이해하면 됩니다.

soso03185님의 프로필

soso03185

질문자

2021.07.17

감사합니다 복습을 다시 해보겠습니다 !