분산 서버 환경에서는 서버가 다른 서버로 접속할 필요가 있을 수 있음
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를 이용하여 접속이 완료될 시 해당 함수를 통해 세션을 생성