Freigeben über


Socket.EndReceiveFrom-Methode

Beendet einen ausstehenden asynchronen Lesevorgang von einem bestimmten Endpunkt.

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

Syntax

'Declaration
Public Function EndReceiveFrom ( _
    asyncResult As IAsyncResult, _
    ByRef endPoint As EndPoint _
) As Integer
'Usage
Dim instance As Socket
Dim asyncResult As IAsyncResult
Dim endPoint As EndPoint
Dim returnValue As Integer

returnValue = instance.EndReceiveFrom(asyncResult, endPoint)
public int EndReceiveFrom (
    IAsyncResult asyncResult,
    ref EndPoint endPoint
)
public:
int EndReceiveFrom (
    IAsyncResult^ asyncResult, 
    EndPoint^% endPoint
)
public int EndReceiveFrom (
    IAsyncResult asyncResult, 
    /** @ref */ EndPoint endPoint
)
JScript unterstützt die Übergabe von Werttypargumenten als Verweis nicht.

Parameter

  • asyncResult
    Ein IAsyncResult, das Zustandsinformationen über diesen asynchronen Vorgang sowie ggf. vorhandene benutzerdefinierte Daten speichert.

Rückgabewert

Wenn erfolgreich, die Anzahl der empfangenen Bytes. Wenn die Ausführung nicht erfolgreich ist, wird 0 zurückgegeben.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentNullException

asyncResult ist NULL (Nothing in Visual Basic).

ArgumentException

asyncResult wurde nicht durch einen Aufruf der BeginReceiveFrom-Methode zurückgegeben.

InvalidOperationException

EndReceiveFrom wurde bereits für den asynchronen Lesevorgang aufgerufen.

SocketException

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

ObjectDisposedException

Der Socket wurde geschlossen.

Hinweise

Die EndReceiveFrom-Methode schließt den asynchronen Lesevorgang ab, der in der BeginReceiveFrom-Methode begonnen wurde.

Sie müssen eine Rückrufmethode erstellen, die den AsyncCallback-Delegaten implementiert, bevor Sie BeginReceiveFrom aufrufen können. Diese Rückrufmethode wird in einem eigenen Thread ausgeführt und vom System aufgerufen, nachdem BeginReceiveFrom beendet wurde. Die Rückrufmethode muss das von der BeginReceiveFrom-Methode zurückgegebene IAsyncResult als Parameter akzeptieren.

Rufen Sie in der Rückrufmethode die AsyncState-Methode von IAsyncResult auf, um das an die BeginReceiveFrom-Methode übergebene Zustandsobjekt abzurufen. Extrahieren Sie den Empfangs-Socket aus diesem Zustandsobjekt. Nach dem Abrufen des Socket können Sie die EndReceiveFrom-Methode aufrufen, um den Lesevorgang erfolgreich abzuschließen und die Anzahl der gelesenen Bytes zurückzugeben.

Die EndReceiveFrom-Methode wird blockiert, bis Daten verfügbar sind. Bei verbindungslosen Protokollen liest EndReceiveFrom das erste Datagramm in der Warteschlange im Eingangsnetzwerkpuffer. Bei einem verbindungsorientierten Protokoll liest die EndReceiveFrom-Methode alle verfügbaren Daten bis zu der Anzahl der Bytes, die im size-Parameter der BeginReceiveFrom-Methode angegeben sind. Wenn der Remotehost die Socket-Verbindung mit der Shutdown-Methode schließt und alle verfügbaren Daten empfangen wurden, wird die EndReceiveFrom-Methode sofort abgeschlossen, und diese gibt 0 (null) Bytes zurück. Sie können die empfangenen Daten mit der AsyncState-Methode des IAsyncResult-Objekts abrufen und den im resultierenden Zustandsobjekt enthaltenen Puffer extrahieren. Extrahieren Sie zum Identifizieren des Ausgangshosts den EndPoint, und wandeln Sie ihn in einen IPEndPoint um. Rufen Sie mit der IPEndPoint.Address-Methode die IP-Adresse und mit der IPEndPoint.Port-Methode die Anschlussnummer ab.

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.

Beispiel

Im folgenden Codebeispiel wird ein ausstehender asynchroner Lesevorgang von einem bestimmten EndPoint beendet.

   Dim so As StateObject = CType(ar.AsyncState, StateObject)
   Dim s As Socket = so.workSocket
   
   ' Creates a temporary EndPoint to pass to EndReceiveFrom.
   Dim sender As New IPEndPoint(IPAddress.Any, 0)
   Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)
   
   Dim read As Integer = s.EndReceiveFrom(ar, tempRemoteEP)
   
   
   If read > 0 Then
      so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read))
      s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE, 0, tempRemoteEP, New AsyncCallback(AddressOf Async_Send_Receive.ReceiveFrom_Callback), so)
   Else
      If so.sb.Length > 1 Then
         'All the data has been read, so displays it to the console.
         Dim strContent As String
         strContent = so.sb.ToString()
         Console.WriteLine([String].Format("Read {0} byte from socket" + "data = {1} ", strContent.Length, strContent))
      End If
      s.Close()
   End If 
End Sub 'ReceiveFrom_Callback
StateObject so = (StateObject) ar.AsyncState;
Socket s = so.workSocket;

   // Creates a temporary EndPoint to pass to EndReceiveFrom.
   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;

   int read = s.EndReceiveFrom(ar, ref tempRemoteEP); 


if (read > 0) {
        so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));
        s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE, 0, ref tempRemoteEP,
                                 new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so);
}
else{
     if (so.sb.Length > 1) {
          //All the data has been read, so displays it to the console.
          string strContent;
          strContent = so.sb.ToString();
          Console.WriteLine(String.Format("Read {0} byte from socket" + 
                             "data = {1} ", strContent.Length, strContent));
     }
     s.Close();
     
}
StateObject^ so = safe_cast<StateObject^>(ar->AsyncState);
Socket^ s = so->workSocket;

// Creates a temporary EndPoint to pass to EndReceiveFrom.
IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any,0 );
EndPoint^ tempRemoteEP = safe_cast<EndPoint^>(sender);

int read = s->EndReceiveFrom( ar, tempRemoteEP );

if ( read > 0 )
{
   so->sb->Append( Encoding::ASCII->GetString( so->buffer, 0, read ) );
   s->BeginReceiveFrom( so->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None,
      tempRemoteEP, gcnew AsyncCallback( &Async_Send_Receive::ReceiveFrom_Callback ), so );
}
else
{
   if ( so->sb->Length > 1 )
   {
      //All the data has been read, so displays it to the console.
      String^ strContent = so->sb->ToString();
      Console::WriteLine( "Read {0} byte from socket" +
         " data = {1}", strContent->Length, strContent );
   }
   s->Close();
}
StateObject so = (StateObject)ar.get_AsyncState();
Socket s = so.workSocket;
// Creates a temporary EndPoint to pass to EndReceiveFrom.
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;
int read = s.EndReceiveFrom(ar, tempRemoteEP);

if (read > 0) {
    so.sb.Append(Encoding.get_ASCII().GetString(so.buffer, 0, read));
    s.BeginReceiveFrom(so.buffer, 0, StateObject.BUFFER_SIZE,
        (SocketFlags)0, tempRemoteEP,
        new AsyncCallback(Async_Send_Receive.ReceiveFrom_Callback), so);
}
else {
    if (so.sb.get_Length() > 1) {
        //All the data has been read, so displays it to the console.
        String strContent;
        strContent = so.sb.ToString();
        Console.WriteLine(String.Format("Read {0} byte from socket"
            + "data = {1} ", (Int32)(strContent.get_Length()),
            strContent));
    }
    s.Close();
}

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