public void OnNewConnection(IAsyncResult async)
{
SocketServer clientSock = new SocketServer(m_MainSock.EndAccept(async));
try
{
// finished processing socket, go back to listening state.
((Socket)async.AsyncState).BeginAccept(new AsyncCallback(OnNewConnection), async.AsyncState);
// initiate socket state object.
SocketClient clientState = new SocketClient(clientSock);
lock ( this.ClientList )
{
ClientList.Add(clientState);
}
// do further processing for recently connected socket.
clientSock.Socket.BeginReceive(clientSock.m_bRecvBuffer, 0, 0x1000, SocketFlags.None, clientSock.OnDataReceive, clientState);
Logger.Log(Logger.LogLevel.Access, "Server", "[{0}] Client Connected : {1}", ClientList.Count, ((IPEndPoint)clientSock.Socket.RemoteEndPoint).Address.ToString());
// send encryption key
Random rand = new Random();
SMSG_ENCRYPTION_KEY spkt = new SMSG_ENCRYPTION_KEY(rand.Next());
Console.WriteLine("[Server->Client] Encryption");
Console.WriteLine(Misc.HexBytes(spkt.Stream));
clientState.Client.Socket.Send(spkt.Stream);
}
catch (ObjectDisposedException)
{
Logger.Log(Logger.LogLevel.Access, "Server", "[{0}] Socket has been closed.", ClientList.Count);
((Socket)async.AsyncState).BeginAccept(new AsyncCallback(OnNewConnection), async.AsyncState);
}
catch (SocketException se)
{
Logger.Log(Logger.LogLevel.Error, "Server", "OnNewConnection: {0}", se.Message);
((Socket)async.AsyncState).BeginAccept(new AsyncCallback(OnNewConnection), async.AsyncState);
}
}