public GamespyTcpSocket(int Port, int MaxConnections)
{
// Create our Socket
Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Set Socket options
Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, false);
Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
// Bind to our port
Listener.Bind(new IPEndPoint(IPAddress.Any, Port));
Listener.Listen(25);
// Set the rest of our internals
MaxNumConnections = MaxConnections;
MaxConnectionsEnforcer = new SemaphoreSlim(MaxNumConnections, MaxNumConnections);
SocketAcceptPool = new SocketAsyncEventArgsPool(ConcurrentAcceptPoolSize);
SocketReadWritePool = new SocketAsyncEventArgsPool(MaxNumConnections);
// Create our Buffer Manager for IO operations.
// Always allocate double space, one for recieving, and another for sending
BufferManager = new BufferManager(MaxNumConnections * 2, BufferSizePerEventArg);
// Assign our Connection Accept SocketAsyncEventArgs object instances
for (int i = 0; i < ConcurrentAcceptPoolSize; i++)
{
SocketAsyncEventArgs SockArg = new SocketAsyncEventArgs();
SockArg.Completed += (s, e) => PrepareAccept(e);
// Do NOT assign buffer space for Accept operations!
// AcceptAsync does not take require a parameter for buffer size.
SocketAcceptPool.Push(SockArg);
}
// Assign our Connection IO SocketAsyncEventArgs object instances
for (int i = 0; i < MaxNumConnections * 2; i++)
{
SocketAsyncEventArgs SockArg = new SocketAsyncEventArgs();
BufferManager.AssignBuffer(SockArg);
SocketReadWritePool.Push(SockArg);
}
// set public internals
IsListening = true;
IgnoreNewConnections = false;
IsDisposed = false;
}