Если вы действительно можете ограничить свое приложение использованием только Winsock 2, вы можете использовать его механизм условного принятия:
SOCKET sd = socket(...);
listen(sd, ...);
DWORD nTrue = 1;
setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue));
Это изменяет поведение стека, чтобы он автоматически не отправлял ответы SYN-ACK на входящие пакеты SYN, пока установлено соединение. резервное место доступно. Вместо этого ваша программа получает сигнал о том, что она должна принимать соединение как обычно -- select(), WSAEventSelect(), WSAAsyncSelect()... -- тогда вы вызываете WSAAccept() вместо accept():
sockaddr_in sin;
WSAAccept(sd, (sockaddr*)&sin, sizeof(sin), ConditionalAcceptChecker, 0);
Вы пишете функцию ConditionalAcceptChecker(), чтобы просмотреть информацию о входящем соединении и решить, принимать ли соединение. В вашем случае вы можете просто вернуть CF_REJECT
, если вы уже обрабатываете соединение.
Опять же, имейте в виду, что этот механизм специфичен для Winsock 2. Если вам нужно переносимое поведение, совет других сообщений закрыть прослушивающий сокет, пока ваша программа уже имеет соединение, лучше.
person
Warren Young
schedule
15.10.2009