• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Completed가 자동 콜백 해줄텐데 왜 직접적으로 또 호출하나요?

24.01.15 14:53 작성 24.01.15 14:57 수정 조회수 169

0

public void Init(IPEndPoint endPoint, Action<Socket> OnAcceptHandler)

{

_acceptHandler += OnAcceptHandler;

_listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

_listenSocket.Bind(endPoint);

_listenSocket.Listen(10);

SocketAsyncEventArgs e = new SocketAsyncEventArgs();

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

RegisterAccept(e);

}

void RegisterAccept(SocketAsyncEventArgs e)

{

e.AcceptSocket = null;

bool pending = _listenSocket.AcceptAsync(e);

if (pending == false)

OnAcceptCompleted(null, e);

}

 

이 코드에서 RegisterAccept안에 pending이 false일 때 OnAcceptCompleted를 호출하는 코드를 보여주셨는데

 

이미 SocketAsyncEventArgs.Completed에 콜백 함수 넣어줘서 자동 처리 되는거 아닌가요??

 

실제로 저렇게 함수를 재호출해주는 코드를 빼봐도 정상 작동되는것 같았습니다.

 

이중으로 함수 호출하시는 이유가 뭔지 궁금합니다!

답변 2

·

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.15

안녕하세요, 인프런 AI 인턴입니다.

dpcks5959님의 질문은 SocketAsyncEventArgs.Completed 이벤트와 관련해서 pending 값이 false일 경우에 이미 등록된 이벤트 핸들러(OnAcceptCompleted)가 자동으로 처리될 것으로 예상했지만, 왜 코드에서 if (pending == false) 조건을 통해 OnAcceptCompleted를 직접 호출하는지에 대한 것입니다.

제공된 예시에서, pendingfalse일 경우 즉, I/O 작업이 동기적으로 완료된 경우, 이는 ListenSocket.AcceptAsync() 메서드가 동기적으로 연결을 수락할 수 있었다는 것을 의미하며, 이 경우 Completed 이벤트가 발생하지 않습니다. 그렇기 때문에 직접 OnAcceptCompleted를 호출해 주어야 합니다. 반면에 pendingtrue일 경우 I/O 작업이 비동기적으로 진행되고 있으며, 완료되면 Completed 이벤트가 발생하여 이벤트 핸들러(OnAcceptCompleted)가 자동으로 호출됩니다.

이러한 작업 흐름은 Microsoft의 공식 문서에서도 확인할 수 있으며, 관련된 질문과 답변이 인프런의 이전 질문들에서도 다뤄졌습니다.

구체적으로 아래에 사용자의 질문과 유사한 상황에 대한 설명이 담긴 기존 답변들의 URL을 첨부합니다:

이 정보들을 확인하시면 SocketAsyncEventArgs.Completed 이벤트의 작동 원리와 pending 값에 따른 처리 방법에 대해 더 명확하게 이해하실 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

bool pending = _listenSocket.AcceptAsync(e);

if (pending == false)

OnAcceptCompleted(null, e);

이 부분에서 '바로' 처리되면, pending이 false로 뜨고 그럴 경우
우리가 직접 호출해야 한다고 문서에 나와있습니다.
(이 부분은 MSDN을 확인해보시면 됩니다.)
따라서 이것은 왜? 그런지 이해하는 부분은 아니고
그냥 .NET 라이브러리를 활용하는 측면에서 받아들여야 하는 부분입니다.

dpcks5959님의 프로필

dpcks5959

질문자

2024.01.15

답변 감사합니다!

저도 그런 얘기를 들어서 msdn을 찾아봤는데 해당 내용이 안보여서 질문 드려봤습니다.

업데이트 하면서 고쳐진건진 모르겠지만 좀 더 찾아보겠습니다.