/// <summary>
        /// Initialise the server, use this method when loading from the configuration file.
        /// </summary>
        private void Initialise()
        {
            // Create the configuration readers.
            _securityReader    = new Nequeo.Security.Configuration.Reader();
            _serverReader      = new Net.Configuration.Reader();
            _appSettingsReader = new System.Configuration.AppSettingsReader();

            // Get the non-secure IPv4 and IPv6 host details.
            _serverHostElementV4 = _serverReader.GetServerHost(_socketProviderHostPrefix + _hostV4);
            _serverHostElementV6 = _serverReader.GetServerHost(_socketProviderHostPrefix + _hostV6);

            // Get the secure IPv4 and IPv6 host details.
            _sslServerHostElementV4 = _serverReader.GetServerHost(_socketProviderHostPrefix + _sslHostV4);
            _sslServerHostElementV6 = _serverReader.GetServerHost(_socketProviderHostPrefix + _sslHostV6);

            // Get the collective maximum number
            // of clients for all servers.
            _collectiveMaxNumberOfClientsValue = Int32.MaxValue;

            // Create the non-secure IPv4 endpoint.
            _addressesV4    = new IPAddress[1];
            _addressesV4[0] = IPAddress.Any;

            // Create the non-secure IPv6 endpoint.
            _addressesV6    = new IPAddress[1];
            _addressesV6[0] = IPAddress.IPv6Any;

            // Create the secure IPv4 endpoint.
            _sslAddressesV4    = new IPAddress[1];
            _sslAddressesV4[0] = IPAddress.Any;

            // Create the secure IPv6 endpoint.
            _sslAddressesV6    = new IPAddress[1];
            _sslAddressesV6[0] = IPAddress.IPv6Any;

            // Create the milti-endpoint model.
            _multiEndpointModels = new Net.Sockets.MultiEndpointModel[4];

            // Assign the non-secure IPv4 model details.
            AssignServerMultiModelDetails(0, _addressesV4, _serverHostElementV4);

            // Assign the non-secure IPv6 model details.
            AssignServerMultiModelDetails(1, _addressesV6, _serverHostElementV6);

            // Assign the secure IPv4 model details.
            AssignServerMultiModelDetails(2, _sslAddressesV4, _sslServerHostElementV4);

            // Assign the secure IPv6 model details.
            AssignServerMultiModelDetails(3, _sslAddressesV6, _sslServerHostElementV6);

            // Assign from max collective clients.
            _maxNumClients = _collectiveMaxNumberOfClientsValue;
        }
 /// <summary>
 /// Assign server details.
 /// </summary>
 /// <param name="index">The server index.</param>
 /// <param name="serverHostElement">The server host element for the current server.</param>
 private void AssignServerDetails(int index, Net.Configuration.ServerHostElement serverHostElement)
 {
     // If the maximum number of clients is individual control by the server.
     // such that it is not collectively controlled.
     if (serverHostElement.IndividualControl)
     {
         _socketServer[index].MaxNumClientsIndividualControl = serverHostElement.IndividualControl;
         _socketServer[index].MaxNumClients = serverHostElement.MaxNumClients;
     }
     else
     {
         _socketServer[index].MaxNumClientsIndividualControl = serverHostElement.IndividualControl;
         _socketServer[index].MaxNumClients = _collectiveMaxNumberOfClientsValue;
     }
 }
 /// <summary>
 /// Assign server multi model details.
 /// </summary>
 /// <param name="index">The multi-endpoint index.</param>
 /// <param name="addresses">The IP address endpoint collection.</param>
 /// <param name="serverHostElement">The server host element for the current server.</param>
 private void AssignServerMultiModelDetails(int index, IPAddress[] addresses, Net.Configuration.ServerHostElement serverHostElement)
 {
     // Assign the IPv4 or IPv6 model details.
     _multiEndpointModels[index].Addresses = addresses;
     _multiEndpointModels[index].Port      = serverHostElement.Port;
 }