Socket.BeginReceive メソッド

接続されている Socket からの非同期のデータ受信を開始します。

Public Function BeginReceive( _
   ByVal buffer() As Byte, _   ByVal offset As Integer, _   ByVal size As Integer, _   ByVal socketFlags As SocketFlags, _   ByVal callback As AsyncCallback, _   ByVal state As Object _) As IAsyncResult
[C#]
public IAsyncResult BeginReceive(byte[] buffer,intoffset,intsize,SocketFlagssocketFlags,AsyncCallbackcallback,objectstate);
[C++]
public: IAsyncResult* BeginReceive(unsigned charbuffer __gc[],intoffset,intsize,SocketFlagssocketFlags,AsyncCallback* callback,Object* state);
[JScript]
public function BeginReceive(
   buffer : Byte[],offset : int,size : int,socketFlags : SocketFlags,callback : AsyncCallback,state : Object) : IAsyncResult;

パラメータ

  • buffer
    受信したデータのストレージ場所となる Byte 型の配列。
  • offset
    受信データを格納する、 buffer パラメータ内の、インデックス番号が 0 から始まる位置。
  • size
    受信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。
  • callback
    AsyncCallback デリゲート。
  • state
    要求の状態情報を格納するオブジェクト。

戻り値

非同期の読み取りを参照する IAsyncResult

例外

例外の種類 条件
ArgumentNullException buffer が null 参照 (Visual Basic では Nothing) です。
SocketException ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。
ObjectDisposedException Socket が閉じられています。
ArgumentOutOfRangeException offset が 0 未満です。

または

offsetbuffer の長さを超えています。

または

size が 0 未満です。

または

size が、 buffer の長さから offset パラメータの値を引いた値を超えています。

解説

BeginReceive メソッドは、 EndAccept によって返された Socket からの非同期のデータ読み取りを開始します。 BeginReceive メソッドを呼び出すと、個別の実行スレッド内でデータを受信できます。

AsyncCallback デリゲートを実装するコールバック メソッドを作成し、その名前を BeginReceive メソッドに渡すことができます。これを行うには、最低限、通信に使用される接続済みのまたは既定の Socketstate パラメータに含まれている必要があります。コールバック メソッド内で受信データを取得しなければならないため、 読み取りバッファなどの有用な情報を保持するための小さなクラスまたは構造体を作成する必要があります。構造体またはクラスのインスタンスは、 state パラメータを使用して BeginReceive メソッドに渡します。

コールバック メソッドは EndReceive メソッドを実装する必要があります。アプリケーションが BeginReceive を呼び出すと、指定したコールバック メソッドが個別のスレッドを使用して実行され、 EndReceive は、 Socket がデータを読み取るか例外をスローするまでブロックします。 BeginReceive メソッドを呼び出してから元のスレッドをブロックする場合は、 WaitHandle.WaitOne を使用します。元のスレッドの実行を継続させるには、コールバック メソッドで ManualResetEvent.Set を呼び出します。コールバック メソッドの記述に関する追加情報については、「 Callback のサンプル 」を参照してください。

コネクション指向のソケットおよびコネクションレスのソケットの両方から BeginReceive を呼び出すことができます。 BeginReceive メソッドを呼び出す前に、 ConnectBeginConnectAccept 、または BeginAccept を呼び出しておく必要があります。 BeginReceive メソッドは、これらのメソッドのいずれかで指定したリモート ホストから送信されたデータしか読み取らないためです。コネクションレスのプロトコルを使用している場合は、 BeginReceiveFrom メソッドも使用できます。 BeginReceiveFrom を使用すると、どのホストから送信されたデータでも受信できます。

コネクション指向の Socket を使用している場合、 BeginReceive メソッドは、 size パラメータで指定したバイト数までの、使用可能なデータをすべて読み取ります。

コネクションレスの Socket を使用している場合、 BeginReceive は、 Connect メソッドまたは BeginConnect メソッドで指定した接続先のアドレスから、最初にキューに格納されたデータグラムを読み取ります。受信するデータグラムのサイズが buffer パラメータのサイズより大きい場合、 buffer にはメッセージの最初の部分が格納され、 SocketException がスローされます。信頼性のないプロトコルを使用すると、超過データが失われます。信頼性のあるプロトコルを使用している場合、超過データはサービス プロバイダによって保持されるため、十分に大きなバッファを使用して BeginReceive メソッドを呼び出すことによって、そのデータを取得できます。

OutOfBand フラグを socketFlags パラメータとして指定し、 SocketOutOfBandInline オプションを使用して帯域外データのインライン受信用に設定されており、帯域外データを使用できる場合、 BeginReceive は帯域外データだけを返します。OOB データは、接続しているストリーム ソケットの各ペアに関連付けられる、論理的に独立した伝送チャネルです。このデータは、高い優先順位で、通常のデータとは独立して送信されます。 Peek フラグを指定した場合、使用できるデータは受信バッファにコピーされますが、システム バッファからは削除されません。

メモ    SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。

使用例

[Visual Basic, C#, C++] 接続されている Socket から、データの非同期の受信を開始する例を次に示します。

 
allDone.Set()
Dim s As Socket = CType(ar.AsyncState, Socket)
Dim s2 As Socket = s.EndAccept(ar)
Dim so2 As New StateObject()
so2.workSocket = s2
s2.BeginReceive(so2.buffer, 0, StateObject.BUFFER_SIZE, 0, New AsyncCallback(AddressOf Async_Send_Receive.Read_Callback), so2)
   End Sub 'Listen_Callback
   

[C#] 
allDone.Set();
Socket s = (Socket) ar.AsyncState;
Socket s2 = s.EndAccept(ar);
StateObject so2 = new StateObject();
so2.workSocket = s2;
s2.BeginReceive(so2.buffer, 0, StateObject.BUFFER_SIZE,0,
                      new AsyncCallback(Async_Send_Receive.Read_Callback), so2);    

[C++] 
allDone->Set();
Socket* s = __try_cast<Socket*>(ar->AsyncState);
Socket* s2 = s->EndAccept(ar);
StateObject* so2 = new StateObject();
so2->workSocket = s2;
s2->BeginReceive(so2->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None,
    new AsyncCallback(0, &Async_Send_Receive::Read_Callback), so2);    

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | 非同期呼び出しの組み込み | EndAccept | AsyncCallback | Callback のサンプル | Connect | BeginReceiveFrom