public GamespyTcpSocket(IPEndPoint bindTo, 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(bindTo); Listener.Listen(25); // Set the rest of our internals MaxNumConnections = MaxConnections; MaxConnectionsEnforcer = new SemaphoreSlim(MaxNumConnections, MaxNumConnections); SocketAcceptPool = new SocketAsyncEventArgsPool(ConcurrentAcceptPoolSize); SocketReadWritePool = new SocketAsyncEventArgsPool(MaxNumConnections * 2); // Create our Buffer Manager for IO operations. // Always allocate double space, one for recieving, and another for sending BufferManager = new BufferManager(MaxNumConnections * 2, BufferSizePerOperation); // 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! 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; }
public GamespyUdpSocket(IPEndPoint bindTo, int MaxConnections) { // Create our Socket this.Port = Port; Listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) { SendTimeout = 5000, // We have a limited pool, so we dont want to be locked often SendBufferSize = BufferSizePerEvent, ReceiveBufferSize = BufferSizePerEvent }; // Bind to our port Listener.Bind(bindTo); // Set the rest of our internals MaxNumConnections = MaxConnections; MaxConnectionsEnforcer = new SemaphoreSlim(MaxNumConnections, MaxNumConnections); SocketReadWritePool = new SocketAsyncEventArgsPool(MaxNumConnections); // Create our Buffer Manager for IO operations. BufferManager = new BufferManager( MaxNumConnections, BufferSizePerEvent ); // Assign our Connection IO SocketAsyncEventArgs object instances for (int i = 0; i < MaxNumConnections; i++) { SocketAsyncEventArgs SockArg = new SocketAsyncEventArgs(); SockArg.Completed += IOComplete; BufferManager.AssignBuffer(SockArg); SocketReadWritePool.Push(SockArg); } // set public internals IsRunning = true; IsDisposed = false; }