• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

15분 질문입니다.

22.02.19 23:44 작성 조회수 135

0

 

 

 

지금 초기화부분 (init에서) 먼저 등록을 해주고 pending이 false이면 OnAcceptCompleted를 호출을 할 것이고

 

pending이 true라면 

이부분에서 자동적으로 OnAcceptCompleted를 호출한다고 하셨는데

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

이부분이 args의 Compledted함수에서 응답(액션같은게 오면) OnAcceptCompleted 함수를 부르겠다(콜백하겠다) 의미까는 이해가 갔습니다.

 

그런데 궁금한것이  pending이 true일 경우 자동적으로 OnAcceptCompleted  호출한다는 말씀이

 

무었인지 잘 이해가 안갑니다.

 

1) 번질문

SocketAsyncEventArgs args = new SocketAsyncEventArgs();를 init에 만들어 주고,

 

RegisterAccept에서

 

_listenSocket.AcceptAsync(args); 하게 되면,

 

false인지 true인지를 pending에다가 뱉어주는데 

 

true일 경우에 args.Completed함수에 EventHander라는

액션이 가게 되어 callback으로 등록해둔 함수가 호출이 되는 것인가요?

 

2)번질문

만약, 1)번에서 질문 한 내용이 맞다면

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

한 이유는

AcceptAsync(args);했을 때 true가 나오면 Completed함수가 자동으로 호출이 된다는 말씀이신가요?

 

3) 번질문

제가 1), 2)번 질문의도나 이해 방향이 틀렷다면 

 

그냥 간단하게 생각해서

 

 bool pending = _listenSocket.AcceptAsync(args);를 해주는 순간 

 

pending이 false이면  if (pending == false)

                OnAcceptCompleted(null, args);

 

이대로 가는 것이고

pending이  true일 경우 AcceptAsync에 인자로 넣은 args에 

EventHandler? 가 true라고 args의 Complete함수에 알려주는 것인가요? 

 

 

4)번질문 

 

제가 Completed에 뭔가 액션이 오면 콜백으로 OnAcceptComplete를 호출하는 것은 이해를 했는데,

 

pending이 true일 경우

args.Completed함수에

액션이 어떻게 Completed 가게되어지는지를 조금 이해가 안되는데

 

이부분은 제가 콜백을 이해를 못한것인가요? 

 

아니면 args가 어떻게 동작하는지 아직 이해를 못해서 그런것인가요??

답변 1

답변을 작성해보세요.

0

우선 늘 동일하지만, 먼저 구글링을 하시고 MSDN을 살펴보시고 문서를 읽어보시기 바랍니다.

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

pending이 true인 경우, 아직은 우리가 원하는 행동 (Recv, Send, Accept 등)이 완료되진 않았지만
나중에라도 완료되면, Completed에 += 로 넣어준 콜백 함수를 호출해서 알려주겠다는 약속을 하게 됩니다.
이미 다른 코드가 실행되는데, 어떻게 해당 함수를 호출해주지?
싶을 수도 있지만 breakpoint를 잡아보면 다른 쓰레드에서 이를 호출해주고
이를 관리하는 것은 .NET Framework 차원에서 해주게 됩니다.

starkshn님의 프로필

starkshn

질문자

2022.02.21

넵 감사합니다!