server connector

ㅋㅋ·2022년 10월 30일

csharp게임서버

목록 보기
7/16

분산 서버 환경에서는 서버가 다른 서버로 접속할 필요가 있을 수 있음

public void Connect(IPEndPoint endPoint, Func<Session> sessionFactory)
{
    Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    _sessionFactory = sessionFactory;

    SocketAsyncEventArgs args = new SocketAsyncEventArgs();
    args.Completed += OnConnectCompleted;
    args.RemoteEndPoint = endPoint;
    args.UserToken = socket;

    RegisterConnect(args);
}

void RegisterConnect(SocketAsyncEventArgs args)
{
    Socket socket = args.UserToken as Socket;
    if (socket == null)
    {
        return;
    }

    bool pending = socket.ConnectAsync(args);
    if (pending == false)
    {
        OnConnectCompleted(null, args);
    }
}

void OnConnectCompleted(object sender, SocketAsyncEventArgs args)
{
    if (args.SocketError == SocketError.Success)
    {
        Session session = _sessionFactory.Invoke();
        session.Start(args.ConnectSocket);
        session.OnConnected(args.RemoteEndPoint);
    }
    else
    {
        Console.WriteLine($"OnConnectedCompleted fail: {args.RemoteEndPoint}");
    }
}

SocketAsyncEventArgs의 UserToken에 소켓을 저장해두고 사용

멤버 변수로 만들어 사용할 수 있지만 여러 서버에 접속해야할 경우가 있을 수 있음

listner와 마찬가지로 sessionFactory를 이용하여 접속이 완료될 시 해당 함수를 통해 세션을 생성

0개의 댓글