Socket.BeginReceiveFrom Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Начинает выполнение асинхронного приема данных с указанного сетевого устройства.
public:
IAsyncResult ^ BeginReceiveFrom(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socketFlags, System::Net::EndPoint ^ % remoteEP, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback? callback, object? state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback callback, object state);
member this.BeginReceiveFrom : byte[] * int * int * System.Net.Sockets.SocketFlags * EndPoint * AsyncCallback * obj -> IAsyncResult
Public Function BeginReceiveFrom (buffer As Byte(), offset As Integer, size As Integer, socketFlags As SocketFlags, ByRef remoteEP As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult
Параметры
- offset
- Int32
Отсчитываемая с нуля позиция в параметре buffer
, начиная с которой хранятся данные.
- size
- Int32
Количество байтов, которые необходимо получить.
- socketFlags
- SocketFlags
Поразрядное сочетание значений SocketFlags.
- remoteEP
- EndPoint
Ссылка на EndPoint объект того же типа, что и конечная точка удаленного узла, обновляемая при синхронном получении.
- callback
- AsyncCallback
Делегат AsyncCallback.
- state
- Object
Объект, содержащий сведения о состоянии для этого запроса.
Возвращаемое значение
Объект IAsyncResult, который ссылается на асинхронное чтение.
Исключения
платформа .NET Framework и .NET 5 и более ранних версий: при попытке доступа к сокету произошла ошибка.
Значение параметраoffset
меньше 0.
-или-
Значение offset
превышает длину buffer
.
-или-
Значение параметраsize
меньше 0.
-или-
Значениеsize
превышает значение, полученное, если отнять от длины buffer
значение параметра offset
.
Socket был закрыт.
Вызывающий объект, находящийся выше в стеке вызовов, не имеет разрешения на запрошенную операцию.
Комментарии
Важно!
Это API совместимости. Мы не рекомендуем использовать методы APM (Begin*
и End*
) для разработки новых приложений. Вместо этого используйте эквиваленты на Task
основе .
Вы можете передать обратный вызов, реализующий AsyncCallback для BeginReceiveFrom , чтобы получать уведомления о завершении операции. Обратите внимание, что если базовый сетевой стек выполняет операцию синхронно, обратный вызов будет выполняться во время вызова BeginReceiveFrom. В этом случае свойству CompletedSynchronously возвращаемого IAsyncResult объекта будет присвоено значение true
, чтобы указать, что метод завершился синхронно.
AsyncState Используйте свойство объекта , IAsyncResult чтобы получить объект состояния, переданный методу BeginReceiveFrom .
Асинхронная BeginReceiveFrom операция должна быть завершена путем вызова EndReceiveFrom метода . Как правило, метод вызывается делегатом AsyncCallback . EndReceiveFrom блокирует вызывающий поток до завершения операции.
Этот метод считывает данные в buffer
параметр и захватывает конечную точку удаленного узла, из которой отправляются данные. Сведения о том, как получить эту конечную точку, см. в EndReceiveFromразделе . Этот метод наиболее полезен, если вы планируете асинхронно получать датаграммы без подключения от неизвестного узла или нескольких узлов. В таких случаях считывает первую датаграмму в очереди, BeginReceiveFrom полученную в буфер локальной сети. Если получаемая датаграмма больше, чем размер buffer
, BeginReceiveFrom метод заполняет buffer
как можно большее количество сообщений и выдает SocketExceptionисключение . Если вы используете ненадежный протокол, лишние данные будут потеряны. Если вы используете надежный протокол, избыточные данные будут сохранены поставщиком услуг, и вы можете получить их, вызвав BeginReceiveFrom метод с достаточно большим буфером.
Чтобы гарантировать, что конечная точка удаленного узла всегда возвращается, приложение должно явным образом привязать Socket к локальной конечной точке с помощью Bind метода , а затем вызвать SetSocketOption метод с optionLevel
параметром IPIPv6 или соответствующим значением, optionName
параметром , равным PacketInformation, и optionValue
параметром , чтобы включить этот параметр перед вызовом BeginReceiveFrom метода. В противном случае конечная точка удаленного узла может быть не возвращена, если отправитель отправил несколько датаграмм до того, как получатель вызовет BeginReceiveFrom метод .
Хотя BeginReceiveFrom предназначен для протоколов без подключения, можно также использовать протокол, ориентированный на подключение. Если вы решили сделать это, сначала необходимо установить подключение к удаленному узлу, вызвав Connect / BeginConnect метод , или принять входящий запрос на подключение, вызвав Accept метод или BeginAccept . При вызове BeginReceiveFrom метода перед установкой или принятием подключения вы получите SocketException. Вы также можете установить удаленный узел по умолчанию для протокола без подключения перед вызовом BeginReceiveFrom метода .
Параметр remoteEp
При использовании сокетов, ориентированных на подключение, считывает столько данных, сколько доступно, вплоть до количества байтов, BeginReceiveFrom указанного параметром size
.
Чтобы отменить ожидающий BeginReceiveFrom, вызовите Close метод .
Примечание
Если вы получаете SocketException, используйте SocketException.ErrorCode свойство , чтобы получить конкретный код ошибки.
Примечание
Данный член генерирует сведения трассировки, если в приложении включена трассировка сети. Дополнительные сведения см. в статье Трассировка сети в платформа .NET Framework.
Примечание
Контекст выполнения (контекст безопасности, олицетворенный пользователь и контекст вызова) кэшируется для асинхронных Socket методов. После первого использования определенного контекста (конкретного асинхронного Socket метода, конкретного Socket экземпляра и определенного обратного вызова) последующие использования этого контекста будут наблюдаться повышение производительности.