Разница между сокетами.NET от функций AsyncState и EndAccept()

При чтении этого примера Async Sockets я нахожу этот код:

    // Get the socket that handles the client request.
    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);

У меня возникают проблемы с поиском документации о разнице между этими двумя сокетами, и я также хотел бы знать, как выключение или закрытие обработчика повлияет на исходный сокет. Кто-нибудь может объяснить это или указать мне какую-то документацию?

3 ответа

Решение

Сокет - это уникальное соединение на конкретной машине, т.е. 127.0.0.1:1024, Одновременно может быть установлено только одно активное соединение. "Слушатель" прослушивает фиксированный порт (например, 1024 в моем примере выше). Его работа заключается в том, чтобы быть "публичным" способом принятия соединений. Как только он принимает соединение, он создает новый сокет на новом, случайно (ну, разумно, псевдослучайно) выбранном порту. Затем исходное соединительное приложение и хост могут обмениваться данными через этот сокет, освобождая прослушивающий сокет, чтобы получить другое соединение (которое будет выдавать другой номер порта для нового соединения и т. Д.).

EndAccept как правило, все, что вам нужно сделать, когда у вас есть соединение. listener обычно идет на прослушивание, чтобы принять больше соединений. Если нет, вы обычно просто располагаете или закрываете сокет, чтобы прекратить прослушивание и отменить все ожидающие принятия. handler используется для любых коммуникаций, необходимых вашему приложению, совершенно независимо от listener разъем. Когда вы закончите с handler гнездо вы располагаете или закрываете его и потому что listener является независимым, он продолжает работать.

Shutdown сбросит все ожидающие данные на сокете, ориентированном на соединение Close) и не повлияет на другие сокеты.

Слушатель - это сокет, который прослушивает соединения. Вы не хотите, чтобы слушатель был занят, иначе несколько клиентов не смогут подключиться через этот сокет. Вызов EndAccept для этого сокета дает вам сокет для сервера для связи с клиентом и открывает приемник для дополнительных соединений.

Закрытие обработчика не должно влиять на сокет слушателя.

Любое приложение сервера.NET, основанное на сокетах, будет содержать как минимум два вида сокетов:

  1. Сокет слушателя для прослушивания входящих соединений (синхронно или асинхронно)
  2. Клиентский сокет, который возвращается вызовом метода Accept() сокета слушателя.

Вы ссылаетесь на пример асинхронного прослушивания, когда сокет сначала вызывает метод BeginAccept() с адресом асинхронного метода в качестве параметра. Теперь, если вы не вызовете соответствующий метод EndAccept(), исходный сокет слушателя будет заблокирован, и любые дальнейшие соединения от клиента могут быть потеряны.

Метод Socket.ShutDown(Both) используется для корректного отключения сокета с подключениями, тогда как Socket.Disconnect(True) будет принудительно делать то же самое. В любом случае Socket.Close() должен следовать этим методам. Смотрите эту ссылку SO для получения дополнительной информации об этом: C#/.NET Socket.Shutdown

Другие вопросы по тегам