Вкл. windows : посмотрите на WSAAccept, возможно, это то, что вам нужно:
SOCKET WSAAccept(
__in SOCKET s,
__out struct sockaddr *addr,
__inout LPINT addrlen,
__in LPCONDITIONPROC lpfnCondition,
__in DWORD dwCallbackData
);
lpfnCondition - адрес необязательной, заданной приложением условной функции, которая примет решение принять / отклонить на основе информации о вызывающем абоненте, переданной в качестве параметров, и при необходимости создаст или присоединит группу сокетов, назначив соответствующее значение параметр результата g этой функции. Если этот параметр равен NULL, то функция условия не вызывается.
Для решения linux посмотрите: GNU Common C ++ - класс TCPSocket, он имеет методы onAccept () и reject ().
virtual bool TCPSocket::onAccept ( const InetHostAddress & ia,
tpport_t port
) [inline, protected, virtual]
Метод для вызова производного класса TCPSocket, который действует как сервер, когда принимается запрос на соединение.
Сервер может реализовать специальные правила протокола, чтобы исключить принятие удаленного сокета путем возврата false. Для этой цели также можно использовать метод Peek.
Однако, вы можете просто закрыть сокет после принятия, если предварительное условие ложно:)