protected async void PrepareAccept(SocketAsyncEventArgs AcceptEventArg)
{
// If we do not get a success code here, we have a bad socket
if (IgnoreNewConnections || AcceptEventArg.SocketError != SocketError.Success)
{
// This method closes the socket and releases all resources, both
// managed and unmanaged. It internally calls Dispose.
AcceptEventArg.AcceptSocket.Close();
// Put the SAEA back in the pool.
SocketAcceptPool.Push(AcceptEventArg);
StartAcceptAsync();
return;
}
// If the server is full, send an error message to the player
if (ConnectionEnforceMode == EnforceMode.DuringPrepare)
{
bool Success = await MaxConnectionsEnforcer.WaitAsync(WaitTimeout);
if (!Success)
{
// If we arent even listening...
if (!IsListening) return;
// Alert the client that we are full
if (!String.IsNullOrEmpty(FullErrorMessage))
{
byte[] buffer = Encoding.UTF8.GetBytes(
String.Format(@"\error\\err\0\fatal\\errmsg\{0}\id\1\final\", FullErrorMessage)
);
AcceptEventArg.AcceptSocket.Send(buffer);
}
// Log so we can track this!
Program.ErrorLog.Write("NOTICE: [GamespyTcpSocket.PrepareAccept] The Server is currently full! Rejecting connecting client.");
// Put the SAEA back in the pool.
AcceptEventArg.AcceptSocket.Close();
SocketAcceptPool.Push(AcceptEventArg);
StartAcceptAsync();
return;
}
}
// Begin accepting a new connection
StartAcceptAsync();
// Grab a send/recieve object
SocketAsyncEventArgs ReadArgs = SocketReadWritePool.Pop();
SocketAsyncEventArgs WriteArgs = SocketReadWritePool.Pop();
// Pass over the reference to the new socket that is handling
// this specific stream, and dereference it so we can hand the
// acception event back over
ReadArgs.AcceptSocket = AcceptEventArg.AcceptSocket;
WriteArgs.AcceptSocket = AcceptEventArg.AcceptSocket;
AcceptEventArg.AcceptSocket = null;
// Hand back the AcceptEventArg so another connection can be accepted
SocketAcceptPool.Push(AcceptEventArg);
// Hand off processing to the parent
GamespyTcpStream Stream = null;
try
{
Stream = new GamespyTcpStream(this, ReadArgs, WriteArgs);
ProcessAccept(Stream);
}
catch (Exception e)
{
// Report Error
Program.ErrorLog.Write("ERROR: An Error occured at [GamespyTcpSocket.PrepareAccept] : Generating Exception Log");
ExceptionHandler.GenerateExceptionLog(e);
// Make sure the connection is closed properly
if (Stream != null)
Release(Stream);
}
}