inflearn logo
강의

Course

Instructor

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

Session #1

listener, session 간의 차이

652

jiw720

17 asked

0

안녕하세요, listener, session 코드간 차이점에 대해서 질문이 있습니다.

1, listener에서는 OnRecvCompleted()와같은 메서드에서 socketerror가 발생했을 때, disconnect를 하지 않았는데, session에서는 왜 disconnect를 하는 건가요?

2.listener 에서는 registerRecv() 와같은 함수를 OnRecvCompleted의 if, else와 상관없이 실행한거같은데, 왜 session에서는 if(args.Bytes.Transferred > 0 && ~~~) 을 만족해야 OnRecvCompleted를 실행하는건가요?

 

 

 

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)
        {

            //BytesTransferred == 몇바이트 받았는지
            if (args.BytesTransferred>0 && args.SocketError == SocketError.Success)
            {

                try
                {
                    string recvData = Encoding.UTF8.GetString(args.Buffer, args.Offset, args.BytesTransferred);
                    Console.WriteLine($"[from client] : {recvData}");
                    RegisterRecv(args);
                }
                catch(Exception e)
                {
                    Console.WriteLine($"onrecvcompleted failed {e}");
                }
                
                
                
            }
            else
            {
                //TODO Disconnect 
            }
            
        }
    }
}

network C# unity

Answer 3

0

jiw720

감사합니다. 그런데,

listener는 accept를 실패했더라도 다른 client들을 계속 기다려야 하니까 if, else절 상관없이 받는 것이라고 이해했긴 했는데, (맞는진 모르겠습니다)

session은 recv를 한번의 stream들만 받는거니까 계속해서 args.BytesTransferred > 0 인 경우에만 계속해서

RegisterRecv(args); 로 낚싯대를 놓는걸로 이해했는데 맞을까요?

 

0

Rookiss

네 그렇습니다.

accept는 딱히 실패할 이유가 없고, 찰나의 순간 연결이 끊긴다면
어차피 Recv 0로 감지가 가능합니다.

Recv했는데 0 바이트를 수신했다는 것은,
(처음 수신 버퍼 사이즈를 0바이트로 일부러 세팅하는 0byte Recv 등의 기법이 아니라면)
무조건 상대방 연결이 끊길 때 발생합니다.

0

jiw720

2번질문에 대한 답변은 어떻게 이해하면될까요?

0

Rookiss

Register 즉 등록 단계는 우리 마음이지만
그것에 대한 성공 여부는 상대방과 통신 성공 여부에 따라 다르기 때문입니다.

낚시대를 던진다 = Register
낚시대를 끌어올려서 확인한다 = OnRecvCompleted (근데 낚시대가 끊어졌다면? FAIL)

0

Rookiss

Listener는 문지기의 역할이고,
Session은 들어온 다음에 상대방 클라를 대표하는 일종의 대리인입니다.
따라서 세션이 끊기면 킥해주는 것이지만
Listener는 서버에서 문지기 역할을 담당하기에
우리가 내보낼 일이 없습니다.

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