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(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socket_flags, System::Net::EndPoint ^ % remote_end, 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);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socket_flags, ref System.Net.EndPoint remote_end, AsyncCallback callback, object state);
member this.BeginReceiveFrom : byte[] * int * int * System.Net.Sockets.SocketFlags * EndPoint * AsyncCallback * obj -> IAsyncResult
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
Public Function BeginReceiveFrom (buffer As Byte(), offset As Integer, size As Integer, socket_flags As SocketFlags, ByRef remote_end As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult

Параметры

buffer
Byte[]

Массив типа Byte, который является местоположением памяти для полученных данных.

offset
Int32

Отсчитываемая с нуля позиция в параметре buffer, начиная с которой хранятся данные.

size
Int32

Количество байтов, которые необходимо получить.

socketFlagssocket_flags
SocketFlags

Поразрядное сочетание значений SocketFlags.

remoteEPremote_end
EndPoint

Ссылка на EndPoint объект того же типа, что и конечная точка удаленного узла, обновляемая при синхронном получении.

callback
AsyncCallback

Делегат AsyncCallback.

state
Object

Объект, содержащий сведения о состоянии для этого запроса.

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

IAsyncResult

Объект IAsyncResult, который ссылается на асинхронное чтение.

Исключения

buffer имеет значение null.

-или-

remoteEP имеет значение null.

платформа .NET Framework и .NET 5 и более ранних версий: при попытке доступа к сокету произошла ошибка.

Значение параметраoffset меньше 0.

-или-

Значение offset превышает длину buffer.

-или-

Значение параметраsize меньше 0.

-или-

Значениеsize превышает значение, полученное, если отнять от длины buffer значение параметра offset .

Socket был закрыт.

Вызывающий объект, находящийся выше в стеке вызовов, не имеет разрешения на запрошенную операцию.

Примеры

Следующий пример кода асинхронно получает датаграммы без подключения от удаленного узла.

IPHostEntry^ lipa = Dns::Resolve( "host.contoso.com" );
IPEndPoint^ lep = gcnew IPEndPoint( lipa->AddressList[ 0 ], 11000);

   Socket^ s = gcnew Socket( lep->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp);
   
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any, 0 );
   EndPoint^ tempRemoteEP = (EndPoint^)( sender );
   s->Connect( sender );
   
   try{
      while(true){
         allDone->Reset();
         StateObject^ so2 = gcnew StateObject();
             so2->workSocket = s;
             Console::WriteLine( "Attempting to Receive data from host.contoso.com" );
         
             s->BeginReceiveFrom( so2->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None, tempRemoteEP,
            gcnew AsyncCallback( &Async_Send_Receive::ReceiveFrom_Callback), so2);	
             allDone->WaitOne();
        }
   }
   catch ( Exception^ e )
   {
        Console::WriteLine( e );
   }
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                               SocketType.Dgram,
                                     ProtocolType.Udp);

   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
   EndPoint tempRemoteEP = (EndPoint)sender;
   s.Connect(sender);

   try{
        while(true){
             allDone.Reset();
             StateObject so2 = new StateObject();
             so2.workSocket = s;
             Console.WriteLine("Attempting to Receive data from host.contoso.com");

             s.BeginReceiveFrom(so2.buffer, 0, StateObject.BUFFER_SIZE,0, ref tempRemoteEP,
                                   new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so2);	
             allDone.WaitOne();
        }
   }
   catch (Exception e){
        Console.WriteLine(e.ToString());
   }
   Dim lipa As IPHostEntry = Dns.Resolve("host.contoso.com")
   Dim lep As New IPEndPoint(lipa.AddressList(0), 11000)
   
   Dim s As New Socket(lep.Address.AddressFamily, SocketType.DGram, ProtocolType.Udp)
   
   Dim sender As New IPEndPoint(IPAddress.Any, 0)
   Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)
   s.Connect(sender)
   Try
      While True
         allDone.Reset()
         Dim so2 As New StateObject()
         so2.workSocket = s
         Console.WriteLine("Attempting to Receive data from host.contoso.com")
         
         s.BeginReceiveFrom(so2.buffer, 0, StateObject.BUFFER_SIZE, 0, tempRemoteEP, New AsyncCallback(AddressOf Async_Send_Receive.ReceiveFrom_Callback), so2)
         allDone.WaitOne()
      End While
   Catch e As Exception
      Console.WriteLine(e.ToString())
   End Try
End Sub

Комментарии

Важно!

Это API совместимости. Мы не рекомендуем использовать методы APM (Begin* и End*) для разработки новых приложений. Вместо этого используйте эквиваленты на Taskоснове .

Вы можете передать обратный вызов, реализующий AsyncCallbackBeginReceiveFrom для , чтобы получать уведомления о завершении операции. Обратите внимание, что если базовый сетевой стек выполняет операцию синхронно, обратный вызов будет выполняться во время вызова 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 экземпляра и определенного обратного вызова) последующие использования этого контекста будут наблюдать повышение производительности.

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

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