본문 바로가기
c#_게임서버

소켓프로그래밍

by kcj3054 2022. 6. 28.

Server 부분..

현재 서버ip를 지정하는 중..

 // DNS (Domain Name System)
            // 
            string host = Dns.GetHostName();
            IPHostEntry ipHost = Dns.GetHostEntry(host); // ?
            IPAddress iPAddr = ipHost.AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(iPAddr, 7777);
  • 위의 ipHost.AddressList가 배열인 이유는 구글 같은 것도 트래픽이 많이 발생하는 것들은 여러 ip를 보유중이다. 그중에서 하나를 내가 IpAddr로 받아오겠다는 의미..

  • endPoint는 정확한 주소이다 port까지 연결했다(7777)로..

listener 초기화

        public void Init(IPEndPoint endPoint)
        {
            //문지기.
            Socket _listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            //문지기 교육
            _listenSocket.Bind(endPoint);
            //영업 시작.
            _listenSocket.Listen(10);

            //backlog : 최대 대기수 (게임이 접속 유저가 많을 때 식당 입구에 최대 몇명이  대기할 수 있느지.
            // 대기할 수 있는 수를 초과한 경우 fail이 난다.

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

            RegisterAccept(args);
        }
  • listener는 문지기이다. 문지기를 만들고 -> 교육을한 후 -> 영업을 시작하는 순이다.

  • 여기서 비동기방식으로 하기위해서 SocketAsyncEventArgs로 이벤트를 사용했다. 완료를 이벤트 핸들러를 통해서 받는 방법이다.

  • OnAcceptCompleted가 완료되면 알아서 핸들러가 알려준다.

  • RegisterAccept 시작하면 낚시대를 던지는 역할이다 Accept를 등록해본다..

RegisterAccept

 void RegisterAccept(SocketAsyncEventArgs args)
        {
           bool pending =  _listenSocket.AcceptAsync(args);
            if(pending == false)
            {
                OnAcceptCompleted(null, args);
            }
        }
  • 시작하자마자 낚시대를 던지는 느낌인데 던져서 만약 소켓이 바로 반환되면 OnAcceptCompleted를 호출해준다.

OnAcceptCompleted (accept가 된 상태 )

 void OnAcceptCompleted(object sender, SocketAsyncEventArgs args)
        {

            RegisterAccept(args);
        }

Client 부분..

  static void Main(string[] args)
        {
            // DNS (Domain Name System)
            // 
            string host = Dns.GetHostName();
            IPHostEntry ipHost = Dns.GetHostEntry(host); // ?
            IPAddress iPAddr = ipHost.AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(iPAddr, 7777);

            //휴대폰 설정 (socket 설정).. 
            Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            //보낸다
            byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World");

            int sendBytes = socket.Send(sendBuff);

            //받는다. 
            byte[] recvBuff = new byte[1024];


        }
  • 서버구조의 반대면서, 일단 주소는 정한뒤 -> 휴대폰을 개통하고(socket) 그 후 클라이언트는 보내는 것을 먼저한 후 받는 동작을한다 받을 때 정확한 크기를 몰라서 recvBuff크기를 일단 좀 크게 잡는다.

  • 출처 : 루키스님의 서버강의를 학습 후 작성하였습니다.

'c#_게임서버' 카테고리의 다른 글

mmorpg서버구조  (0) 2022.07.06
spinlock, autoResetEvent, ReaderWriterLock  (0) 2022.07.02
lock  (0) 2022.06.30
멀티쓰레드  (0) 2022.06.28
서버란?  (0) 2022.06.28