inflearn logo
강의

Course

Instructor

[C# and Unity MMORPG Game Development Series] Part 4: Game Server

Session #1

Listener, Session 에서의 콜백메서드 질문

Resolved

351

jiw720

17 asked

0

안녕하세요, listener, session 클래스를 구현할 때, 콜백메서드에 대해 질문이 있습니다.

아래와 같은 코드에서,

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;

namespace ServerCore
{
    class Session
    {
        Socket _socket;
        public void init(Socket socket)
        {
            _socket = socket;

            SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs();
            recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted);
            //userTocken으로 추가적인 정보를 아무거나넘겨줄 수 있다(object를 받기 때문)
            recvArgs.SetBuffer(new byte[1024],0,1024);
            RegisterRecv(recvArgs);
        }

        void RegisterRecv(SocketAsyncEventArgs args)
        {
            args.AcceptSocket = null;

            bool pending = _socket.ReceiveAsync(args);

            //바로 성공했으면
            if(pending == false)
            {
                OnRecvCompleted(null, args);
            }
        }

        void OnRecvCompleted(object obj, SocketAsyncEventArgs args)
        {
            if (args.SocketError == SocketError.Success)
            {
                
                string recvData = Encoding.UTF8.GetString(args.Buffer, 0, args.Buffer.Length);
                Console.WriteLine($"[from client] : {recvData}");
            }
            else
            {
                Console.WriteLine(args.SocketError.ToString());
            }
            RegisterRecv(args);
        }
    }
}

 

 

해당 RegisterRecv()메서드에서 pending이 false인 경우 바로 OnRecvCompleted()를 호출해주는거고, true인 경우 콜백메서드로 OnRecvCompleted가 호출되는 형식이라고 이해를 했는데,

void RegisterRecv(SocketAsyncEventArgs args)
        {
            args.AcceptSocket = null;

            bool pending = _socket.ReceiveAsync(args);

            //바로 성공했으면
            if(pending == false)
            {
                OnRecvCompleted(null, args);
            }
        }

그렇다면, pending이 false인 경우에는

 

if(pending == false)
            {
                OnRecvCompleted(null, args);
            }

여기서 OnRecvCompleted() 호출되고

또 콜백메서드에서 또 한번 호출되는 것 아닌가요?

콜백메서드가 false인 경우에 2번호출되지 않는다는 것을 어떻게 이해하면 될까요?

 

unity C# network

Answer 1

0

Rookiss

또 콜백메서드에서 또 한번 호출되는 것 아닌가요?
-> 아닙니다.

내부적으로 그렇게 동작을 하는 것이라
딱히 이해하는 개념이 아니라 받아들여야 합니다.
이 부분은 MSDN 문서를 살펴보세요.
바로 이벤트가 완료되면, 이벤트가 호출되지 않고
그냥 우리가 직접 처리해야 한다고 하며
이 부분은 사실 C++ 소켓 프로그래밍을 언젠가 해보면 조금 더 이해가 수월할 수 있습니다.


0

jiw720

답변 감사드립니다!

TLS 질문드립니다.

0

43

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

46

2

Unity Span

0

76

2

XML, Dll 차이점

0

105

2

Session 질문입니다

0

79

1

Write Read 커서 키워드

0

76

1

더미 클라이언트 수에 따른 OnDisconnect 발생

0

70

2

네트워크 Send 전담 스레드 배치

0

98

2

UnhandledException 으로 서버 터지는 경우

0

85

2

컨텐츠 단, 엔진 단

0

105

1

질문 있습니다

0

77

2

C# 게임서버 3D MMORPG

0

145

2

유니티6 버전

0

97

2

receive하는 부분과 send하는 부분의 차이

0

134

2

커서의 위치의 중요성

0

103

2

C++ 전혀 모르는데 C# 서버

0

169

2

강의에 질문이 있습니다

0

86

2

멀티스레드 이해도 질문

0

95

1

500 vs 500

0

130

3

OnAcceptHandler 액션 함수

0

61

1

이 정도 서버의 객관적인 수준이 궁금합니다.

0

191

2

36. Serialization #3 에서 string (name) 코드 수정 질문

0

82

2

외부 컴퓨터와의 통신 방법이 궁금합니다

0

106

1

스핀락 질문.

0

110

2