Сделать Connect Fail, если сервер не ожидает приема вызова - PullRequest
0 голосов
/ 03 апреля 2012

Мне нужно создать сокет сервера, который должен отклонять запрос на подключение, если он не блокируется при вызове accept.

Поведение сервера будет

a.дождитесь подключения клиента
b.дождитесь, пока клиент закроет соединение
c.Переходите к шагу a

, если сервер ожидает закрытия клиентского соединения, он должен немедленно отклонить вызов клиентского соединения.Мы не можем закрыть сокет сервера после получения клиентского соединения.

Возможно ли это?

1 Ответ

1 голос
/ 03 апреля 2012

То, что вы просите, просто невозможно на стороне сервера. Нет просто никакого способа отклонить ожидающее соединение, пока оно все еще находится в очереди и ожидает его принятия. Вы можете (и должны) установить значение backlog равным 1 при вызове listen(), но это просто означает, что в очереди может быть не более 1 соединения, пока вы активно общаетесь с другим клиентом. Вам нужно будет вызвать accept(), чтобы удалить это ожидающее соединение из очереди, а затем немедленно вызвать closesocket(), если вы не хотите разговаривать с этим клиентом в то время.

Вместо этого вы можете вызвать WSAAccept() вместо accept(), чтобы вы могли назначить функцию обратного вызова, которая при необходимости возвращает CF_REJECT или CF_ACCEPT, а затем вам нужно постоянно вызывать WSAAccept(), либо в поток или с перекрывающимся вводом-выводом, чтобы удалить ожидающие соединения из очереди и отклонить их, пока вы общаетесь с принятым соединением, пока не закроете его.

...