protected ServerSocket bindConnection(final InetAddress inetAddress,
			final int suggestedPort) throws IOException {
		for (final InetAddress localInetAddress : this.configurationFacade
				.getOutgoingSourceAddresses()) {

			if (localInetAddress.equals(inetAddress)) {
				final ServerSocket serverSocket = new ServerSocket(
						suggestedPort, 1, inetAddress);

				this.logger.info("Bound clientSocket "
						+ StringUtils.formatSocket(serverSocket) + " for "
						+ StringUtils.formatSocket(this.getClientSocket()));

				serverSocket
						.setSoTimeout(AbstractSocksImplementation.BIND_SOCKET_TIMEOUT);

				return serverSocket;
			}
		}

		for (final InetAddress localInetAddress : this.configurationFacade
				.getOutgoingSourceAddresses()) {

			if (localInetAddress.getClass() == inetAddress.getClass()) {
				final ServerSocket serverSocket = new ServerSocket(
						suggestedPort, 1, localInetAddress);

				this.logger.info("Bound clientSocket "
						+ StringUtils.formatSocket(serverSocket) + " for "
						+ StringUtils.formatSocket(this.getClientSocket()));

				serverSocket
						.setSoTimeout(AbstractSocksImplementation.BIND_SOCKET_TIMEOUT);

				return serverSocket;
			}
		}

		final ServerSocket serverSocket = new ServerSocket(suggestedPort, 1,
				this.configurationFacade.getOutgoingSourceAddresses().get(0));

		this.logger.info("Bound clientSocket "
				+ StringUtils.formatSocket(serverSocket) + " for "
				+ StringUtils.formatSocket(this.getClientSocket()));

		serverSocket
				.setSoTimeout(AbstractSocksImplementation.BIND_SOCKET_TIMEOUT);

		return serverSocket;
	}