/// <summary> /// Return the given socket back to the socket pool. /// </summary> /// <param name="socket">Socket connection to return.</param> public static void PutSocket(CustomTcpClient socket) { lock (availableSockets) { TimeSpan socketLifeTime = DateTime.Now.Subtract(socket.TimeCreated); if (TcpConnectionPool.availableSockets.Count < TcpConnectionPool.POOL_MAX_SIZE && socketLifeTime.Minutes < SOCKET_LIFE_TIME_AS_MINUTE) { if (socket != null) { if (socket.Connected) { TcpConnectionPool.availableSockets.Enqueue(socket); } else { DisposeSocket(socket); } } } else { DisposeSocket(socket); } } }
/// <summary> /// Initialize host Connection pool /// </summary> /// <param name="hostIP">host IP Address</param> /// <param name="hostPort">host Port</param> /// <param name="minConnections">Initial number of connections</param> /// <param name="maxConnections">The maximum size of the connection pool</param> public static void InitializeConnectionPool(string hostIPAddress, int hostPortNumber, int minConnections, int maxConnections, int socketLifeTimeAsMinute = 15) { POOL_MAX_SIZE = maxConnections; POOL_MIN_SIZE = minConnections; hostIP = hostIPAddress; hostPort = hostPortNumber; SOCKET_LIFE_TIME_AS_MINUTE = socketLifeTimeAsMinute; availableSockets = new Queue <CustomTcpClient>(); for (int i = 0; i < minConnections; i++) { CustomTcpClient cachedSocket = OpenSocket(); PutSocket(cachedSocket); } Initialized = true; }
private static void DisposeSocket(CustomTcpClient socket) { socket.Close(); socket.Dispose(); TcpConnectionPool.availableSockets.Enqueue(OpenSocket()); }