Socket.EndReceive メソッド

定義

保留中の非同期読み取りを終了します。Ends a pending asynchronous read.

オーバーロード

EndReceive(IAsyncResult)

保留中の非同期読み取りを終了します。Ends a pending asynchronous read.

EndReceive(IAsyncResult, SocketError)

保留中の非同期読み取りを終了します。Ends a pending asynchronous read.

EndReceive(IAsyncResult)

保留中の非同期読み取りを終了します。Ends a pending asynchronous read.

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

パラメーター

asyncResultresult
IAsyncResult

この非同期操作の状態情報およびユーザー定義データを格納する IAsyncResultAn IAsyncResult that stores state information and any user defined data for this asynchronous operation.

戻り値

Int32

受信されたバイト数。The number of bytes received.

例外

asyncResultnullです。asyncResult is null.

BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) メソッドへの呼び出しで asyncResult が返されませんでした。asyncResult was not returned by a call to the BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) method.

EndReceive(IAsyncResult) が、非同期の読み取りのために以前に呼び出されています。EndReceive(IAsyncResult) was previously called for the asynchronous read.

ソケットへのアクセスを試行しているときにエラーが発生しました。An error occurred when attempting to access the socket.

Socket が閉じられました。The Socket has been closed.

次のコード例では、保留中の非同期読み取りを終了します。The following code example ends a pending asynchronous read. ソケットを使用した非同期通信を示す完全な例については、 ソケットのコード例を参照してください。For a complete example that demonstrates asynchronous communications with sockets, see Socket Code Examples.

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

注釈

メソッドは、 EndReceive メソッドで開始された非同期の読み取り操作を完了し BeginReceive ます。The EndReceive method completes the asynchronous read operation started in the BeginReceive method.

を呼び出す前に BeginReceive 、デリゲートを実装するコールバックメソッドを作成する必要があり AsyncCallback ます。Before calling BeginReceive, you need to create a callback method that implements the AsyncCallback delegate. このコールバックメソッドは、別のスレッドで実行され、が返された後にシステムによって呼び出され BeginReceive ます。This callback method executes in a separate thread and is called by the system after BeginReceive returns. コールバックメソッドは、 IAsyncResult BeginReceive パラメーターとしてメソッドによって返されたを受け入れる必要があります。The callback method must accept the IAsyncResult returned by the BeginReceive method as a parameter.

コールバックメソッド内で、のメソッドを呼び出して、 AsyncState IAsyncResult メソッドに渡される状態オブジェクトを取得し BeginReceive ます。Within the callback method, call the AsyncState method of the IAsyncResult to obtain the state object passed to the BeginReceive method. Socketこの状態オブジェクトから受信を抽出します。Extract the receiving Socket from this state object. を取得した後 Socket 、メソッドを呼び出し EndReceive て、読み取り操作を正常に完了し、読み取ったバイト数を返すことができます。After obtaining the Socket, you can call the EndReceive method to successfully complete the read operation and return the number of bytes read.

メソッドは、 EndReceive データが使用可能になるまでブロックします。The EndReceive method will block until data is available. コネクションレスプロトコルを使用している場合、 EndReceive は、受信ネットワークバッファーで使用可能な最初のエンキューされたデータグラムを読み取ります。If you are using a connectionless protocol, EndReceive will read the first enqueued datagram available in the incoming network buffer. 接続指向プロトコルを使用している場合、メソッドは、 EndReceive size メソッドのパラメーターで指定したバイト数まで、使用可能な量のデータを読み取ります BeginReceiveIf you are using a connection-oriented protocol, the EndReceive method will read as much data as is available up to the number of bytes you specified in the size parameter of the BeginReceive method. リモートホストが Socket メソッドとの接続を切断 Shutdown し、使用可能なすべてのデータを受信した場合、 EndReceive メソッドは直ちに完了し、0バイトを返します。If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the EndReceive method will complete immediately and return zero bytes.

受信したデータを取得するには、のメソッドを呼び出し、 AsyncState IAsyncResult 結果の状態オブジェクトに格納されているバッファーを抽出します。To obtain the received data, call the AsyncState method of the IAsyncResult, and extract the buffer contained in the resulting state object.

保留中のを取り消すには、 BeginReceive メソッドを呼び出し Close ます。To cancel a pending BeginReceive, call the Close method.

注意

を受け取った場合は、プロパティを使用して、 SocketException SocketException.ErrorCode 特定のエラーコードを取得します。If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. このコードを取得したら、 Windows Sockets version 2 API エラーコード のドキュメントを参照して、エラーの詳細な説明を参照してください。After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

注意

特定のスレッドによって開始されるすべての i/o は、そのスレッドが終了すると取り消されます。All I/O initiated by a given thread is canceled when that thread exits. 保留中の非同期操作は、操作が完了する前にスレッドが終了した場合に失敗する可能性があります。A pending asynchronous operation can fail if the thread exits before the operation completes.

注意

このメンバーは、アプリケーションでネットワーク トレースが有効にされている場合にトレース情報を出力します。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.

こちらもご覧ください

適用対象

EndReceive(IAsyncResult, SocketError)

保留中の非同期読み取りを終了します。Ends a pending asynchronous read.

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

パラメーター

asyncResult
IAsyncResult

この非同期操作の状態情報およびユーザー定義データを格納する IAsyncResultAn IAsyncResult that stores state information and any user defined data for this asynchronous operation.

errorCode
SocketError

ソケット エラーを格納する SocketError オブジェクト。A SocketError object that stores the socket error.

戻り値

Int32

受信されたバイト数。The number of bytes received.

例外

asyncResultnullです。asyncResult is null.

BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) メソッドへの呼び出しで asyncResult が返されませんでした。asyncResult was not returned by a call to the BeginReceive(Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object) method.

EndReceive(IAsyncResult) が、非同期の読み取りのために以前に呼び出されています。EndReceive(IAsyncResult) was previously called for the asynchronous read.

ソケットへのアクセスを試行しているときにエラーが発生しました。An error occurred when attempting to access the socket.

Socket が閉じられました。The Socket has been closed.

注釈

メソッドは、 EndReceive メソッドで開始された非同期の読み取り操作を完了し BeginReceive ます。The EndReceive method completes the asynchronous read operation started in the BeginReceive method.

を呼び出す前に BeginReceive 、デリゲートを実装するコールバックメソッドを作成する必要があり AsyncCallback ます。Before calling BeginReceive, you need to create a callback method that implements the AsyncCallback delegate. このコールバックメソッドは、別のスレッドで実行され、が返された後にシステムによって呼び出され BeginReceive ます。This callback method executes in a separate thread and is called by the system after BeginReceive returns. コールバックメソッドは、 IAsyncResult BeginReceive パラメーターとしてメソッドによって返されたを受け入れる必要があります。The callback method must accept the IAsyncResult returned by the BeginReceive method as a parameter.

コールバックメソッド内で、のメソッドを呼び出して、 AsyncState IAsyncResult メソッドに渡される状態オブジェクトを取得し BeginReceive ます。Within the callback method, call the AsyncState method of the IAsyncResult to obtain the state object passed to the BeginReceive method. Socketこの状態オブジェクトから受信を抽出します。Extract the receiving Socket from this state object. を取得した後 Socket 、メソッドを呼び出し EndReceive て、読み取り操作を正常に完了し、読み取ったバイト数を返すことができます。After obtaining the Socket, you can call the EndReceive method to successfully complete the read operation and return the number of bytes read.

メソッドは、 EndReceive データが使用可能になるまでブロックします。The EndReceive method will block until data is available. コネクションレスプロトコルを使用している場合、 EndReceive は、受信ネットワークバッファーで使用可能な最初のエンキューされたデータグラムを読み取ります。If you are using a connectionless protocol, EndReceive will read the first enqueued datagram available in the incoming network buffer. 接続指向プロトコルを使用している場合、メソッドは、 EndReceive size メソッドのパラメーターで指定したバイト数まで、使用可能な量のデータを読み取ります BeginReceiveIf you are using a connection-oriented protocol, the EndReceive method will read as much data as is available up to the number of bytes you specified in the size parameter of the BeginReceive method. リモートホストが Socket メソッドとの接続を切断 Shutdown し、使用可能なすべてのデータを受信した場合、 EndReceive メソッドは直ちに完了し、0バイトを返します。If the remote host shuts down the Socket connection with the Shutdown method, and all available data has been received, the EndReceive method will complete immediately and return zero bytes.

受信したデータを取得するには、のメソッドを呼び出し、 AsyncState IAsyncResult 結果の状態オブジェクトに格納されているバッファーを抽出します。To obtain the received data, call the AsyncState method of the IAsyncResult, and extract the buffer contained in the resulting state object.

注意

を受け取った場合は、プロパティを使用して、 SocketException SocketException.ErrorCode 特定のエラーコードを取得します。If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. このコードを取得したら、 Windows Sockets version 2 API エラーコード のドキュメントを参照して、エラーの詳細な説明を参照してください。After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

注意

特定のスレッドによって開始されるすべての i/o は、そのスレッドが終了すると取り消されます。All I/O initiated by a given thread is canceled when that thread exits. 保留中の非同期操作は、操作が完了する前にスレッドが終了した場合に失敗する可能性があります。A pending asynchronous operation can fail if the thread exits before the operation completes.

注意

このメンバーは、アプリケーションでネットワーク トレースが有効にされている場合にトレース情報を出力します。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.

こちらもご覧ください

適用対象