Freigeben über


Socket.BeginReceiveFrom-Methode

Beginnt den asynchronen Datenempfang aus dem angegebenen Netzwerkgerät.

Namespace: System.Net.Sockets
Assembly: System (in system.dll)

Syntax

'Declaration
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
'Usage
Dim instance As Socket
Dim buffer As Byte()
Dim offset As Integer
Dim size As Integer
Dim socketFlags As SocketFlags
Dim remoteEP As EndPoint
Dim callback As AsyncCallback
Dim state As Object
Dim returnValue As IAsyncResult

returnValue = instance.BeginReceiveFrom(buffer, offset, size, socketFlags, remoteEP, callback, state)
public IAsyncResult BeginReceiveFrom (
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    ref EndPoint remoteEP,
    AsyncCallback callback,
    Object state
)
public:
IAsyncResult^ BeginReceiveFrom (
    array<unsigned char>^ buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    EndPoint^% remoteEP, 
    AsyncCallback^ callback, 
    Object^ state
)
public IAsyncResult BeginReceiveFrom (
    byte[] buffer, 
    int offset, 
    int size, 
    SocketFlags socketFlags, 
    /** @ref */ EndPoint remoteEP, 
    AsyncCallback callback, 
    Object state
)
JScript unterstützt die Übergabe von Werttypargumenten als Verweis nicht.

Parameter

  • buffer
    Ein Array vom Typ Byte, das der Speicherort für die empfangenen Daten ist.
  • offset
    Die nullbasierte Position im buffer-Parameter, an der die Daten gespeichert werden.
  • size
    Die Anzahl der zu empfangenden Bytes.
  • socketFlags
    Eine bitweise Kombination der SocketFlags-Werte.
  • remoteEP
    Ein EndPoint, der die Datenquelle darstellt.
  • state
    Ein Objekt mit Zustandsinformationen für diese Anforderung.

Rückgabewert

Ein IAsyncResult, das auf den asynchronen Lesevorgang verweist.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentNullException

buffer ist NULL (Nothing in Visual Basic).

– oder –

remoteEP ist NULL (Nothing in Visual Basic).

SocketException

Fehler beim Zugriff auf den Socket. Weitere Informationen finden Sie im Abschnitt "Hinweise".

ArgumentOutOfRangeException

offset ist kleiner als 0 (null).

– oder –

offset ist größer als die Länge von buffer.

– oder –

size ist kleiner als 0 (null).

– oder –

size ist größer als die Länge von buffer minus dem Wert des offset-Parameters.

ObjectDisposedException

Der Socket wurde geschlossen.

SecurityException

Ein in der Aufrufliste übergeordneter Aufrufer hat keine Berechtigung für den angeforderten Vorgang.

Hinweise

Die BeginReceiveFrom-Methode beginnt, verbindungslose Datagramme von einem Remotehost asynchron zu lesen. Durch einen Aufruf der BeginReceiveFrom-Methode können Sie Daten in einem eigenen Ausführungsthread empfangen.

Sie können eine Rückrufmethode erstellen, die den AsyncCallback-Delegaten implementiert, und den Namen an die BeginReceiveFrom-Methode übergeben. Dafür muss der state-Parameter mindestens den verbundenen oder den Standard-Socket enthalten, der für die Kommunikation verwendet wird. Wenn für einen Rückruf mehr Informationen benötigt werden, können Sie eine kleine Klasse erzeugen, die den Socket und die weiteren erforderlichen Informationen enthält. Übergeben Sie eine Instanz dieser Klasse über den state-Parameter an die BeginReceiveFrom-Methode.

Die Rückrufmethode muss die EndReceiveFrom-Methode aufrufen. Bei einem Aufruf von BeginReceiveFrom verwendet das System einen eigenen Thread zum Ausführen der angegebenen Rückrufmethode und blockiert EndReceiveFrom, bis der Socket Daten liest oder eine Ausnahme auslöst. Wenn der ursprüngliche Thread blockiert werden soll, nachdem die BeginReceiveFrom-Methode aufgerufen wurde, verwenden Sie WaitHandle.WaitOne. Rufen Sie in der Rückrufmethode die Set-Methode für ein T:System.Threading.ManualResetEvent auf, wenn der ursprüngliche Thread weiter ausgeführt werden soll. Weitere Informationen über das Verfassen von Rückrufmethoden finden Sie unter Beispiel zu Callbacks.

Hinweis

Sie müssen den Socket mit der Bind-Methode explizit an einen lokalen Endpunkt binden, bevor Sie BeginReceiveFrom aufrufen, sonst löst BeginReceiveFrom eine SocketException aus.

Diese Methode liest Daten in den buffer-Parameter und zeichnet den Remotehost-Endpunkt auf, von dem die Daten gesendet werden. Weitere Informationen über das Abrufen dieses Endpunktes finden Sie unter EndReceiveFrom. Diese Methode bietet sich besonders dann an, wenn Sie verbindungslose Datagramme von einem unbekannten Host oder mehreren Hosts asynchron empfangen möchten. In diesem Fall liest BeginReceiveFrom das erste empfangene Datagramm in der Warteschlange in den lokalen Netzwerkpuffer. Wenn das empfangene Datagramm die Größe von buffer übersteigt, füllt die BeginReceiveFrom-Methode den buffer soweit wie möglich mit der Meldung und löst eine SocketException aus. Bei unzuverlässigen Protokollen gehen die überzähligen Daten verloren. Wenn Sie ein zuverlässiges Protokoll verwenden, werden die Daten vom Dienstanbieter zurückgehalten und können durch einen Aufruf der BeginReceiveFrom-Methode mit einem ausreichend großen Puffer abgerufen werden.

BeginReceiveFrom ist in erster Linie für verbindungslose Protokolle konzipiert, kann jedoch auch mit verbindungsorientierten Protokollen verwendet werden. In diesem Fall müssen Sie zuerst eine Remotehostverbindung herstellen, indem Sie die Connect-Methode oder die BeginConnect-Methode aufrufen. Wahlweise können Sie auch eine eingehende Verbindungsanforderung durch Aufruf der Accept-Methode oder der BeginAccept-Methode annehmen. Wenn Sie die BeginReceiveFrom-Methode aufrufen, bevor eine Verbindung hergestellt oder angenommen wurde, wird eine SocketException ausgelöst. Sie können einen Standardremotehost für ein verbindungsloses Protokoll auch vor dem Aufruf der BeginReceiveFrom-Methode einrichten. In beiden Fällen wird der remoteEP-Parameter von der BeginReceiveFrom-Methode ignoriert, und es werden nur Daten vom Standardhost oder dem Host, mit dem eine Verbindung besteht, empfangen.

Bei verbindungsorientierten Sockets liest BeginReceiveFrom alle verfügbaren Daten bis zu der vom size-Parameter angegebenen Anzahl von Bytes.

Um ein ausstehendes BeginReceiveFrom abzubrechen, rufen Sie die Close-Methode auf.

Hinweis

Wenn Sie eine SocketException erhalten, können Sie mit der SocketException.ErrorCode-Eigenschaft den spezifischen Fehlercode abrufen. Nachdem Sie diesen Code abgerufen haben, finden Sie in der Dokumentation der MSDN Library zu API-Fehlercodes unter Windows Sockets, Version 2, eine ausführliche Beschreibung des Fehlers.

Hinweis

Dieser Member gibt Ablaufverfolgungsinformationen aus, wenn Sie die Netzwerkablaufverfolgung in der Anwendung aktivieren. Weitere Informationen finden Sie unter Netzwerkablaufverfolgung.

Hinweis

Der Ausführungskontext (der Sicherheitskontext, der Benutzer, dessen Identität verwendet wird, und der Kontext des Aufrufs) wird für die asynchrone Socket-Methode zwischengespeichert. Nach der ersten Verwendung eines bestimmten Kontexts (eine bestimmte asynchrone Socket-Methode, eine bestimmte Socket-Instanz und ein bestimmter Rückruf) führen weitere Verwendungen zu einer besseren Leistung.

Beispiel

Im folgenden Codebeispiel werden verbindungslose Datagramme asynchron von einem Remotehost empfangen.

   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 'ReceiveFrom
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());
   }
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 );
   }

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Socket-Klasse
Socket-Member
System.Net.Sockets-Namespace
EndReceiveFrom
AsyncCallback
Bind
Connect
Accept

Weitere Ressourcen

Beispiel zu Callbacks