Поделиться через


Socket.AcceptAsync Метод

Определение

Перегрузки

AcceptAsync()

Принимает входящее подключение.

AcceptAsync(Socket)

Принимает входящее подключение.

AcceptAsync(SocketAsyncEventArgs)

Начинает асинхронную операцию, чтобы принять попытку входящего подключения.

AcceptAsync(CancellationToken)

Принимает входящее подключение.

AcceptAsync(Socket, CancellationToken)

Принимает входящее подключение.

AcceptAsync()

Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs

Принимает входящее подключение.

public:
 System::Threading::Tasks::Task<System::Net::Sockets::Socket ^> ^ AcceptAsync();
public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync ();
member this.AcceptAsync : unit -> System.Threading.Tasks.Task<System.Net.Sockets.Socket>
Public Function AcceptAsync () As Task(Of Socket)

Возвращаемое значение

Асинхронная задача, которая завершается с принятым сокетом.

Исключения

Предпринят запрос выполнения недопустимой операции. Это исключение возникает, если принимающий объект Socket не производит прослушивание подключений или принимающий сокет является связанным.

Требуется вызвать объект Bind(EndPoint) и метод Listen(Int32) перед вызовом метода AcceptAsync(SocketAsyncEventArgs).

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

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Комментарии

Этот метод сохраняет в задаче все исключения, не относящиеся к использованию, которые может создавать синхронный аналог метода. Если исключение сохраняется в возвращаемой задаче, это исключение будет создано при ожидании задачи. Исключения использования, такие как ArgumentException, по-прежнему создаются синхронно. Хранимые исключения см. в разделе исключения, создаваемые Accept().

Применяется к

AcceptAsync(Socket)

Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs

Принимает входящее подключение.

public:
 System::Threading::Tasks::Task<System::Net::Sockets::Socket ^> ^ AcceptAsync(System::Net::Sockets::Socket ^ acceptSocket);
public System.Threading.Tasks.Task<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket);
member this.AcceptAsync : System.Net.Sockets.Socket -> System.Threading.Tasks.Task<System.Net.Sockets.Socket>
Public Function AcceptAsync (acceptSocket As Socket) As Task(Of Socket)

Параметры

acceptSocket
Socket

Сокет, используемый для принятия подключения.

Возвращаемое значение

Асинхронная задача, которая завершается с принятым сокетом.

Исключения

Предпринят запрос выполнения недопустимой операции. Это исключение возникает, если принимающий объект Socket не производит прослушивание подключений или принимающий сокет является связанным.

Требуется вызвать объект Bind(EndPoint) и метод Listen(Int32) перед вызовом метода AcceptAsync(SocketAsyncEventArgs).

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

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Применяется к

AcceptAsync(SocketAsyncEventArgs)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

Начинает асинхронную операцию, чтобы принять попытку входящего подключения.

public:
 bool AcceptAsync(System::Net::Sockets::SocketAsyncEventArgs ^ e);
public bool AcceptAsync (System.Net.Sockets.SocketAsyncEventArgs e);
member this.AcceptAsync : System.Net.Sockets.SocketAsyncEventArgs -> bool
Public Function AcceptAsync (e As SocketAsyncEventArgs) As Boolean

Параметры

e
SocketAsyncEventArgs

Объект SocketAsyncEventArgs для использования в данной асинхронной операции сокета.

Возвращаемое значение

true, если операция ввода-вывода находится в состоянии ожидания. По завершении операции создается событие Completed в параметре e.

false, если операция ввода-вывода завершена синхронно. Событие Completed на параметре e не произойдет и объект e, передаваемый как параметр, можно изучить сразу после получения результатов вызова метода для извлечения результатов операции.

Исключения

Аргумент является недопустимым. Это исключение возникает, если обеспечиваемый буфер имеет недостаточный размер. Буфер должен иметь размер, равный, по крайней мере, 2 * (размер(SOCKADDR_STORAGE + 16) байт.

Это исключение также возникает, если задано несколько буферов, свойство BufferList не имеет значение "null".

Аргумент вне диапазона. Исключение возникает, если объект Count имеет значение меньше 0.

Предпринят запрос выполнения недопустимой операции. Это исключение возникает, если принимающий объект Socket не производит прослушивание подключений или принимающий сокет является связанным.

Требуется вызвать объект Bind(EndPoint) и метод Listen(Int32) перед вызовом метода AcceptAsync(SocketAsyncEventArgs).

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

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Комментарии

Протоколы, ориентированные на AcceptAsync подключение, могут использовать метод для асинхронной обработки входящих попыток подключения. Асинхронное принятие подключений дает возможность отправлять и получать данные в отдельном потоке выполнения. Перед вызовом AcceptAsync метода необходимо вызвать метод для прослушивания и постановки Listen в очередь входящих запросов на подключение.

Чтобы получать уведомления о завершении, необходимо создать метод обратного вызова, который реализует делегат EventHandler<SocketAsyncEventArgs> и перехватит его к событию SocketAsyncEventArgs.Completed .

Для объекта требуются следующие свойства и события System.Net.Sockets.SocketAsyncEventArgs :

При необходимости вызывающий объект может указать существующий Socket объект для использования для входящего подключения, указав Socket для использования со свойством SocketAsyncEventArgs.AcceptSocket .

SocketAsyncEventArgs.AcceptSocket Если свойство имеет значение NULL, создается новый Socket объект с тем же AddressFamilyзначением , SocketTypeи ProtocolType в качестве текущего Socket и устанавливается в SocketAsyncEventArgs.AcceptSocket качестве свойства .

Вызывающий объект может задать SocketAsyncEventArgs.UserToken для свойства любой объект пользовательского состояния, требуемый перед вызовом AcceptAsync метода , чтобы данные можно было получить в методе обратного вызова. Если для обратного вызова требуется больше сведений, чем для одного объекта, можно создать небольшой класс для хранения других необходимых сведений о состоянии в качестве членов.

При необходимости можно предоставить буфер, в котором будет получен начальный блок данных в сокете после успешного ConnectAsync выполнения метода. В этом случае свойству SocketAsyncEventArgs.Buffer необходимо присвоить буфер, содержащий данные для получения, а SocketAsyncEventArgs.Count свойству — максимальное количество байтов данных, получаемых в буфере. Эти свойства можно задать с помощью SocketAsyncEventArgs.SetBuffer метода . Часть переданного буфера будет использоваться внутри для использования базовым вызовом Winsock AcceptEx. Это означает, что объем возвращаемых данных всегда будет меньше значения SocketAsyncEventArgs.Count свойства в указанном экземпляре System.Net.Sockets.SocketAsyncEventArgs . Объем используемого буфера зависит от семейства адресов сокета. Минимальный требуемый размер буфера составляет 288 байт. Если указан буфер большего размера, то Socket будет ожидать некоторые дополнительные данные, отличные от данных адреса, полученных вызовом Winsock AcceptEx, и будет ожидать получения этих дополнительных данных. Если истекло время ожидания, подключение сбрасывается. Таким образом, если ожидается определенное количество дополнительных данных, размер буфера должен быть установлен на минимальный размер буфера плюс этот объем.

Метод обратного вызова завершения должен проверить свойство , SocketAsyncEventArgs.SocketError чтобы определить, была ли AcceptAsync операция успешной.

Это SocketAsyncEventArgs.Completed событие может возникать в некоторых случаях, когда соединение не было принято и свойство SocketAsyncEventArgs.SocketError должно иметь значение ConnectionReset. Это может произойти в результате сканирования портов с использованием полуоткрытого сканирования типа SYN (последовательность SYN -> SYN-ACK -> RST). Приложения, использующие метод , AcceptAsync должны быть подготовлены к обработке этого условия.

См. также раздел

Применяется к

AcceptAsync(CancellationToken)

Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs

Принимает входящее подключение.

public:
 System::Threading::Tasks::ValueTask<System::Net::Sockets::Socket ^> AcceptAsync(System::Threading::CancellationToken cancellationToken);
public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Threading.CancellationToken cancellationToken);
member this.AcceptAsync : System.Threading.CancellationToken -> System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket>
Public Function AcceptAsync (cancellationToken As CancellationToken) As ValueTask(Of Socket)

Параметры

cancellationToken
CancellationToken

Маркер отмены, который можно использовать для отмены асинхронной операции.

Возвращаемое значение

Асинхронная задача, которая завершается с принятым сокетом.

Исключения

Предпринят запрос выполнения недопустимой операции. Это исключение возникает, если принимающий объект Socket не производит прослушивание подключений или принимающий сокет является связанным.

Требуется вызвать объект Bind(EndPoint) и метод Listen(Int32) перед вызовом метода AcceptAsync(SocketAsyncEventArgs).

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

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Маркер отмены был отменен. Это исключение сохраняется в возвращаемой задаче.

Комментарии

Этот метод сохраняет в задаче все исключения, не относящиеся к использованию, которые может создавать синхронный аналог метода. Если исключение сохраняется в возвращаемой задаче, это исключение будет создано при ожидании задачи. Исключения использования, такие как ArgumentException, по-прежнему создаются синхронно. Хранимые исключения см. в разделе исключения, создаваемые Accept().

Применяется к

AcceptAsync(Socket, CancellationToken)

Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs
Исходный код:
Socket.Tasks.cs

Принимает входящее подключение.

public:
 System::Threading::Tasks::ValueTask<System::Net::Sockets::Socket ^> AcceptAsync(System::Net::Sockets::Socket ^ acceptSocket, System::Threading::CancellationToken cancellationToken);
public System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket> AcceptAsync (System.Net.Sockets.Socket? acceptSocket, System.Threading.CancellationToken cancellationToken);
member this.AcceptAsync : System.Net.Sockets.Socket * System.Threading.CancellationToken -> System.Threading.Tasks.ValueTask<System.Net.Sockets.Socket>
Public Function AcceptAsync (acceptSocket As Socket, cancellationToken As CancellationToken) As ValueTask(Of Socket)

Параметры

acceptSocket
Socket

Сокет, используемый для принятия подключения.

cancellationToken
CancellationToken

Маркер отмены, который можно использовать для отмены асинхронной операции.

Возвращаемое значение

Асинхронная задача, которая завершается с принятым сокетом.

Исключения

Предпринят запрос выполнения недопустимой операции. Это исключение возникает, если принимающий объект Socket не производит прослушивание подключений или принимающий сокет является связанным.

Требуется вызвать объект Bind(EndPoint) и метод Listen(Int32) перед вызовом метода AcceptAsync(SocketAsyncEventArgs).

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

Произошла ошибка при попытке доступа к сокету.

Socket был закрыт.

Маркер отмены был отменен. Это исключение сохраняется в возвращаемой задаче.

Применяется к