Как отклонить попытку подключения в C #? - PullRequest
3 голосов
/ 24 мая 2011

У меня есть сокет, который прослушивает соединения.То, что я хочу сделать, это иметь опцию принять / отклонить при попытке подключения.Это мой код:

private void StartListening()
{
    while (running)
    {
        AcceptingSocket.Listen(100);
        Socket client = AcceptingSocket.Accept();

        if (IncomingConnection!= null)
        {
            TcpEventArgs eventArgs = new TcpEventArgs(client);
            IncomingConnection(eventArgs);
        }
    }
}

Есть ли способ, которым .Accept проверяет, хочет ли пользователь принять или отклонить соединение?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Как сказал @Blindy, вам нужно принять входящее соединение, а затем закрыть его, если вы решите, что не хотите устанавливать это соединение. До возврата Accept у вас нет ссылки на Socket, поэтому вы не можете сделать что-либо, что позволило бы вам принять решение о том, принимать или не принимать, на основе клиента (например, проверить предоставленные учетные данные). или адрес источника соединения).

С точки зрения клиента, после подключения к сокету Listen соединение устанавливается (соединение устанавливается с портом прослушивания ОС, а затем передается вам в вызове Accept). Нельзя подделать ошибку типа «Соединение отказано / другая сторона активно отказала в соединении» на Socket, который находится в состоянии прослушивания. Так что Accept, за которым следует Close, будет выглядеть для клиента так же, как если бы у Accept был какой-то способ прервать соединение.

Если у вас есть программная причина, по которой вы не разрешаете больше подключений (например, вам нужен только один клиент за раз), вы можете отключить сокет Listen ing после того, как он примет соединение, но обычно плохая идея.

4 голосов
/ 24 мая 2011

Вы (почти) всегда хотите Accept установить соединение, потому что решение о том, подключаться или нет, может приниматься только на основании информации, отправленной клиентом (имя пользователя, пароль и т. Д.).

Поэтому после установления соединения запустите модуль авторизации, чтобы собрать информацию для аутентификации, и на основании этого решите, следует ли вызывать Close на client (в вашем примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...