Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Method

Definition

Начинает выполнение асинхронного приема данных с указанного сетевого устройства.Begins to asynchronously receive data from a specified network device.

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 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

Parameters

buffer
Byte[]

Массив типа Byte, который является местоположением памяти для полученных данных.An array of type Byte that is the storage location for the received data.

offset
Int32

Отсчитываемая с нуля позиция в параметре buffer, начиная с которой хранятся данные.The zero-based position in the buffer parameter at which to store the data.

size
Int32

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

socketFlagssocket_flags
SocketFlags

Побитовое сочетание значений SocketFlags.A bitwise combination of the SocketFlags values.

remoteEPremote_end
EndPoint

Объект EndPoint, представляющий источник данных.An EndPoint that represents the source of the data.

callback
AsyncCallback

Делегат AsyncCallback.The AsyncCallback delegate.

state
Object

object, содержащий сведения о состоянии для этого запроса.An object that contains state information for this request.

Returns

IAsyncResult

Объект IAsyncResult, который ссылается на асинхронное чтение.An IAsyncResult that references the asynchronous read.

Exceptions

Параметр buffer равен null.buffer is null.

-или--or- Параметр remoteEP равен null.remoteEP is null.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

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

-или--or- Значение offset превышает длину buffer.offset is greater than the length of buffer.

-или--or- Значение параметра size меньше 0.size is less than 0.

-или--or- Значение size превышает значение, полученное, если отнять от длины buffer значение параметра offset.size is greater than the length of buffer minus the value of the offset parameter.

Socket был закрыт.The Socket has been closed.

Вызывающий объект, находящийся выше в стеке вызовов, не имеет разрешения на запрошенную операцию.A caller higher in the call stack does not have permission for the requested operation.

Examples

В следующем примере кода асинхронно принимаются датаграммы без установления соединения с удаленного узла.The following code example asynchronously receives connectionless datagrams from a remote host.

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

Remarks

Метод BeginReceiveFrom запускает асинхронное чтение датаграмм без подключения с удаленного узла.The BeginReceiveFrom method starts asynchronously reading connectionless datagrams from a remote host. Вызов метода BeginReceiveFrom дает возможность получения данных в отдельном потоке выполнения.Calling the BeginReceiveFrom method gives you the ability to receive data within a separate execution thread.

Можно создать метод обратного вызова, который реализует делегат AsyncCallback и передать его имя в метод BeginReceiveFrom.You can create a callback method that implements the AsyncCallback delegate and pass its name to the BeginReceiveFrom method. Для этого, как минимум, параметр state должен содержать подключенный или Socket по умолчанию, используемый для связи.To do this, at the very minimum, your state parameter must contain the connected or default Socket being used for communication. Если для обратного вызова требуются дополнительные сведения, можно создать небольшой класс для хранения Socket и других необходимых сведений.If your callback needs more information, you can create a small class to hold the Socket and the other required information. Передайте экземпляр этого класса в метод BeginReceiveFrom с помощью параметра state.Pass an instance of this class to the BeginReceiveFrom method through the state parameter.

Метод обратного вызова должен вызывать метод EndReceiveFrom.Your callback method should invoke the EndReceiveFrom method. Когда приложение вызывает BeginReceiveFrom, система будет использовать отдельный поток для выполнения указанного метода обратного вызова, и он будет заблокирован на EndReceiveFrom до тех пор, пока Socket не прочитает данные или не выдаст исключение.When your application calls BeginReceiveFrom, the system will use a separate thread to execute the specified callback method, and it will block on EndReceiveFrom until the Socket reads data or throws an exception. Если вы хотите, чтобы исходный поток блокировался после вызова метода BeginReceiveFrom, используйте WaitHandle.WaitOne.If you want the original thread to block after you call the BeginReceiveFrom method, use WaitHandle.WaitOne. Вызовите метод Set для Т:систем.среадинг.мануалресетевент в методе обратного вызова, если нужно, чтобы исходный поток продолжал выполнение.Call the Set method on a T:System.Threading.ManualResetEvent in the callback method when you want the original thread to continue executing. Дополнительные сведения о написании методов обратного вызова см. в разделе маршалирование делегата в качестве метода обратного вызова.For additional information on writing callback methods, see Marshaling a Delegate as a Callback Method.

Note

Перед вызовом BeginReceiveFromнеобходимо явно привязать Socket к локальной конечной точке с помощью метода Bind, иначе BeginReceiveFrom выдаст исключение SocketException.Before calling BeginReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method, or BeginReceiveFrom will throw a SocketException.

Этот метод считывает данные в параметр buffer и фиксирует конечную точку удаленного узла, из которой отправляются данные.This method reads data into the buffer parameter, and captures the remote host endpoint from which the data is sent. Сведения о том, как получить эту конечную точку, см. в разделе EndReceiveFrom.For information on how to retrieve this endpoint, refer to EndReceiveFrom. Этот метод наиболее удобен, если предполагается асинхронное получение датаграмм без подключения из неизвестного узла или с нескольких узлов.This method is most useful if you intend to asynchronously receive connectionless datagrams from an unknown host or multiple hosts. В таких случаях BeginReceiveFrom будет считывать из буфера локальной сети полученную датаграмму из очереди.In these cases, BeginReceiveFrom will read the first enqueued datagram received into the local network buffer. Если полученная датаграмма превышает размер buffer, метод BeginReceiveFrom будет заполняться buffer с максимально возможной частью сообщения и вызывать SocketException.If the datagram you receive is larger than the size of buffer, the BeginReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. При использовании ненадежного протокола избыточные данные будут потеряны.If you are using an unreliable protocol, the excess data will be lost. Если используется надежный протокол, избыточные данные будут сохранены поставщиком услуг, и его можно будет извлечь, вызвав метод BeginReceiveFrom с достаточно большим буфером.If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the BeginReceiveFrom method with a large enough buffer.

Чтобы гарантировать, что конечная точка удаленного узла всегда возвращается, приложение должно явно привязать Socket к локальной конечной точке с помощью метода Bind, а затем вызвать метод SetSocketOption с параметром optionLevel, для которого задано значение IP или IPv6 соответственно, параметр optionName имеет значение PacketInformationи параметр optionValue, чтобы включить этот параметр перед вызовом метода BeginReceiveFrom.To guarantee that the remote host endpoint is always returned, an application should explicitly bind the Socket to a local endpoint using the Bind method and then call the SetSocketOption method with the optionLevel parameter set to IP or IPv6 as appropriate, the optionName parameter set to PacketInformation, and the optionValue parameter to enable this option before calling the BeginReceiveFrom method. В противном случае конечная точка удаленного узла может быть не возвращена, когда отправитель отправил число датаграмм, прежде чем получатель вызвал метод BeginReceiveFrom.Otherwise, it is possible for the remote host endpoint to not be returned when the sender has sent a number of datagrams before the receiver has called the BeginReceiveFrom method.

Хотя BeginReceiveFrom предназначен для протоколов без подключения, также можно использовать протокол, ориентированный на соединение.Although BeginReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. Если вы решили сделать это, необходимо сначала установить соединение с удаленным узлом, вызвав метод Connect / BeginConnect или приняв входящий запрос на подключение, вызвав метод Accept или BeginAccept.If you choose to do so, you must first either establish a remote host connection by calling the Connect / BeginConnect method or accept an incoming connection request by calling the Accept or BeginAccept method. При вызове метода BeginReceiveFrom перед установкой или приемом соединения вы получите SocketException.If you call the BeginReceiveFrom method before establishing or accepting a connection, you will get a SocketException. Кроме того, можно установить удаленный узел по умолчанию для протокола без установления соединения перед вызовом метода BeginReceiveFrom.You can also establish a default remote host for a connectionless protocol prior to calling the BeginReceiveFrom method. В любом из этих случаев метод BeginReceiveFrom будет игнорировать параметр remoteEP и получить данные только с подключенного или удаленного узла по умолчанию.In either of these cases, the BeginReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

При использовании сокетов, ориентированных на соединение, BeginReceiveFrom будет считывать столько данных, сколько доступно до числа байтов, указанного параметром size.With connection-oriented sockets, BeginReceiveFrom will read as much data as is available up to the number of bytes specified by the size parameter.

Чтобы отменить ожидающее BeginReceiveFrom, вызовите метод Close.To cancel a pending BeginReceiveFrom, call the Close method.

Note

Если вы получаете SocketException, используйте свойство SocketException.ErrorCode для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Note

Данный член генерирует сведения трассировки, если в приложении включена трассировка сети.This member outputs trace information when you enable network tracing in your application. Дополнительные сведения см. в разделе Сетевая трассировка в .NET Framework.For more information, see Network Tracing in the .NET Framework.

Note

Контекст выполнения (контекст безопасности, олицетворенный пользователь и вызывающий контекст) кэшируется для асинхронных Socket методов.The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. После первого использования определенного контекста (определенного асинхронного метода Socket, определенного экземпляра Socket и конкретного обратного вызова), последующие применения этого контекста приводят к повышению производительности.After the first use of a particular context (a specific asynchronous Socket method, a specific Socket instance, and a specific callback), subsequent uses of that context will see a performance improvement.

Applies to

See also