Socket.EndReceive Metoda

Definicja

Kończy oczekujący odczyt asynchroniczny.

Przeciążenia

EndReceive(IAsyncResult)

Kończy oczekujący odczyt asynchroniczny.

EndReceive(IAsyncResult, SocketError)

Kończy oczekujący odczyt asynchroniczny.

EndReceive(IAsyncResult)

Kończy oczekujący odczyt asynchroniczny.

public:
 int EndReceive(IAsyncResult ^ asyncResult);
public:
 int EndReceive(IAsyncResult ^ result);
public int EndReceive (IAsyncResult asyncResult);
public int EndReceive (IAsyncResult result);
member this.EndReceive : IAsyncResult -> int
member this.EndReceive : IAsyncResult -> int
Public Function EndReceive (asyncResult As IAsyncResult) As Integer
Public Function EndReceive (result As IAsyncResult) As Integer

Parametry

asyncResultresult
IAsyncResult

Obiekt IAsyncResult , który przechowuje informacje o stanie i wszystkie dane zdefiniowane przez użytkownika dla tej operacji asynchronicznej.

Zwraca

Int32

Liczba bajtów odebranych.

Wyjątki

asyncResult to null.

asyncResult element nie został zwrócony przez wywołanie BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) metody .

EndReceive(IAsyncResult) wcześniej był wywoływany dla odczytu asynchronicznego.

Wystąpił błąd podczas próby uzyskania dostępu do gniazda.

Element Socket został zamknięty.

Przykłady

Poniższy przykład kodu kończy oczekujący odczyt asynchroniczny. Kompletny przykład przedstawiający asynchroniczną komunikację z gniazdami, zobacz Przykłady kodu gniazda.

static void Read_Callback( IAsyncResult^ ar )
{
   StateObject^ so = safe_cast<StateObject^>(ar->AsyncState);
   Socket^ s = so->workSocket;

   int read = s->EndReceive( ar );

   if ( read > 0 )
   {
      so->sb->Append( Encoding::ASCII->GetString( so->buffer, 0, read ) );
      s->BeginReceive( so->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None,
         gcnew AsyncCallback( &Async_Send_Receive::Read_Callback ), so );
   }
   else
   {
      if ( so->sb->Length > 1 )
      {
         //All of the data has been read, so displays it to the console
         String^ strContent = so->sb->ToString();
         Console::WriteLine( String::Format( "Read {0} byte from socket" +
            " data = {1} ", strContent->Length, strContent ) );
      }
      s->Close();
   }
}
public static void Read_Callback(IAsyncResult ar){
    StateObject so = (StateObject) ar.AsyncState;
    Socket s = so.workSocket;

    int read = s.EndReceive(ar);

    if (read > 0) {
            so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read));
            s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0,
                                     new AsyncCallback(Async_Send_Receive.Read_Callback), so);
    }
    else{
         if (so.sb.Length > 1) {
              //All of 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();
    }
}
Public Shared Sub Read_Callback(ar As IAsyncResult)
   Dim so As StateObject = CType(ar.AsyncState, StateObject)
   Dim s As Socket = so.workSocket
   
   Dim read As Integer = s.EndReceive(ar)
   
   If read > 0 Then
      so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read))
      s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, New AsyncCallback(AddressOf Async_Send_Receive.Read_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

Uwagi

Metoda EndReceive kończy asynchroniczną operację odczytu uruchomioną w metodzie BeginReceive .

Przed wywołaniem BeginReceivemetody należy utworzyć metodę wywołania zwrotnego, która implementuje delegata AsyncCallback . Ta metoda wywołania zwrotnego jest wykonywana w osobnym wątku i jest wywoływana przez system po BeginReceive powrocie. Metoda wywołania zwrotnego musi akceptować IAsyncResult zwrócone przez BeginReceive metodę jako parametr.

W metodzie wywołania zwrotnego wywołaj AsyncState metodę IAsyncResult , aby uzyskać obiekt stanu przekazany do BeginReceive metody . Wyodrębnij odbieranie Socket z tego obiektu stanu. Po uzyskaniu Socketmetody można wywołać metodę EndReceive , aby pomyślnie ukończyć operację odczytu i zwrócić liczbę odczytanych bajtów.

Metoda EndReceive będzie blokować dane do momentu udostępnienia danych. Jeśli używasz protokołu bez połączenia, EndReceive odczytuje pierwszy w kolejce datagram dostępny w buforze sieci przychodzącej. Jeśli używasz protokołu zorientowanego na połączenie, EndReceive metoda odczytuje tyle danych, ile jest dostępnych do liczby bajtów określonych w size parametrze BeginReceive metody . Jeśli host zdalny zamknie Socket połączenie z Shutdown metodą , a wszystkie dostępne dane zostały odebrane, EndReceive metoda zostanie ukończona natychmiast i zwróci zero bajtów.

Aby uzyskać odebrane dane, wywołaj metodę AsyncState IAsyncResult, a następnie wyodrębnij bufor zawarty w obiekcie stanu wynikowego.

Aby anulować oczekujący BeginReceiveelement , wywołaj metodę Close .

Uwaga

Jeśli zostanie wyświetlony element SocketException, użyj SocketException.ErrorCode właściwości , aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z dokumentacją kodu błędu interfejsu API Windows Sockets w wersji 2, aby uzyskać szczegółowy opis błędu.

Uwaga

Wszystkie operacje we/wy inicjowane przez dany wątek są anulowane po zakończeniu tego wątku. Oczekująca operacja asynchroniczna może zakończyć się niepowodzeniem, jeśli wątek zakończy się przed zakończeniem operacji.

Uwaga

Ten element członkowski generuje informacje ze śledzenia pod warunkiem włączenia funkcji śledzenia sieci w aplikacji. Aby uzyskać więcej informacji, zobacz Śledzenie sieci w .NET Framework.

Zobacz też

Dotyczy

EndReceive(IAsyncResult, SocketError)

Kończy oczekujący odczyt asynchroniczny.

public:
 int EndReceive(IAsyncResult ^ asyncResult, [Runtime::InteropServices::Out] System::Net::Sockets::SocketError % errorCode);
public int EndReceive (IAsyncResult asyncResult, out System.Net.Sockets.SocketError errorCode);
member this.EndReceive : IAsyncResult * SocketError -> int
Public Function EndReceive (asyncResult As IAsyncResult, ByRef errorCode As SocketError) As Integer

Parametry

asyncResult
IAsyncResult

Obiekt IAsyncResult , który przechowuje informacje o stanie i wszystkie dane zdefiniowane przez użytkownika dla tej operacji asynchronicznej.

errorCode
SocketError

SocketError Obiekt, który przechowuje błąd gniazda.

Zwraca

Int32

Liczba bajtów odebranych.

Wyjątki

asyncResult to null.

asyncResult element nie został zwrócony przez wywołanie BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) metody .

EndReceive(IAsyncResult) wcześniej był wywoływany dla odczytu asynchronicznego.

Wystąpił błąd podczas próby uzyskania dostępu do gniazda.

Element Socket został zamknięty.

Uwagi

Metoda EndReceive kończy asynchroniczną operację odczytu uruchomioną w metodzie BeginReceive .

Przed wywołaniem BeginReceivemetody należy utworzyć metodę wywołania zwrotnego, która implementuje delegata AsyncCallback . Ta metoda wywołania zwrotnego jest wykonywana w osobnym wątku i jest wywoływana przez system po BeginReceive powrocie. Metoda wywołania zwrotnego musi akceptować IAsyncResult zwrócone przez BeginReceive metodę jako parametr.

W metodzie wywołania zwrotnego wywołaj AsyncState metodę IAsyncResult , aby uzyskać obiekt stanu przekazany do BeginReceive metody . Wyodrębnij odbieranie Socket z tego obiektu stanu. Po uzyskaniu Socketmetody można wywołać metodę EndReceive , aby pomyślnie ukończyć operację odczytu i zwrócić liczbę odczytanych bajtów.

Metoda EndReceive będzie blokować dane do momentu udostępnienia danych. Jeśli używasz protokołu bez połączenia, EndReceive odczytuje pierwszy w kolejce datagram dostępny w buforze sieci przychodzącej. Jeśli używasz protokołu zorientowanego na połączenie, EndReceive metoda odczytuje tyle danych, ile jest dostępnych do liczby bajtów określonych w size parametrze BeginReceive metody . Jeśli host zdalny zamknie Socket połączenie z Shutdown metodą , a wszystkie dostępne dane zostały odebrane, EndReceive metoda zostanie ukończona natychmiast i zwróci zero bajtów.

Aby uzyskać odebrane dane, wywołaj metodę AsyncState IAsyncResult, a następnie wyodrębnij bufor zawarty w obiekcie stanu wynikowego.

Uwaga

Jeśli zostanie wyświetlony element SocketException, użyj SocketException.ErrorCode właściwości , aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z dokumentacją kodu błędu interfejsu API Windows Sockets w wersji 2, aby uzyskać szczegółowy opis błędu.

Uwaga

Wszystkie operacje we/wy inicjowane przez dany wątek są anulowane po zakończeniu tego wątku. Oczekująca operacja asynchroniczna może zakończyć się niepowodzeniem, jeśli wątek zakończy się przed zakończeniem operacji.

Uwaga

Ten element członkowski generuje informacje ze śledzenia pod warunkiem włączenia funkcji śledzenia sieci w aplikacji. Aby uzyskać więcej informacji, zobacz Śledzenie sieci w .NET Framework.

Zobacz też

Dotyczy