Socket.BeginReceiveFrom メソッド

指定したネットワーク デバイスから、データの非同期の受信を開始します。

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

パラメータ

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

戻り値

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

例外

例外の種類 条件
ArgumentNullException buffer が null 参照 (Visual Basic では Nothing) です。

または

remoteEP が null 参照 (Nothing) です。

SocketException ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。
ArgumentOutOfRangeException offset が 0 未満です。

または

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

または

size が 0 未満です。

または

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

ObjectDisposedException Socket は閉じられています。
SecurityException コール スタックの上位にある呼び出し元が、要求された操作のアクセス許可を保持していません。

解説

BeginReceiveFrom メソッドは、リモート ホストからのコネクションレスのデータグラムの非同期読み取りを開始します。 BeginReceiveFrom メソッドを呼び出すと、個別の実行スレッド内でデータを受信できます。

AsyncCallback デリゲートを実装する callback メソッドを作成し、その名前を BeginReceiveFrom メソッドに渡すことができます。これを行うには、最低限、通信に使用される接続済みのまたは既定の Socketstate パラメータに含まれている必要があります。他の情報がコールバックに必要な場合は、小さなクラスを作成して Socket などの必要な情報を保持します。このクラスのインスタンスは、 state パラメータを使用して BeginReceiveFrom メソッドに渡します。

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

メモ    BeginReceiveFrom を呼び出す前に、 Bind メソッドを使用して、 Socket を明示的にローカル エンドポイントにバインドする必要があります。この操作を行わないと、 BeginReceiveFromSocketException をスローします。

このメソッドは、 buffer パラメータにデータを読み込み、データの送信元のリモート ホスト エンドポイントをキャプチャします。このエンドポイントの取得方法については、 EndReceiveFrom のトピックを参照してください。このメソッドは、不明なホストまたは複数のホストからコネクションレスのデータグラムを非同期的に受信する場合に便利です。この場合、 BeginReceiveFrom は、ローカル ネットワーク バッファに受信されたデータグラムのうち、最初にキューに格納されたデータグラムを読み取ります。受信するデータグラムのサイズが buffer より大きい場合、 BeginReceiveFrom メソッドはできるだけ多くのメッセージを buffer に格納しますが、 SocketException をスローします。信頼性のないプロトコルを使用している場合、超過データは失われます。信頼性のあるプロトコルを使用している場合、超過データはサービス プロバイダによって保持されるため、十分に大きなバッファを使用して BeginReceiveFrom メソッドを呼び出すことによって、超過データを取得できます。

BeginReceiveFrom はコネクションレスのプロトコルを想定していますが、コネクション指向のプロトコルにも使用できます。この場合は、 Connect メソッドや BeginConnect メソッドを呼び出してリモート ホストとの接続を確立するか、 Accept メソッドまたは BeginAccept メソッドを呼び出して受信接続要求を受け入れる必要があります。接続の確立または受け入れの前に BeginReceiveFrom メソッドを呼び出すと、 SocketException が発生します。また、 BeginReceiveFrom を呼び出す前に、コネクションレス プロトコルで既定のリモート ホストを確立することもできます。いずれの場合も、 BeginReceiveFrom メソッドは remoteEP パラメータを無視し、接続されているリモート ホストまたは既定のリモート ホストからのデータだけを受信します。

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

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

使用例

[Visual Basic, C#, C++] リモート ホストからコネクションレスのデータグラムを非同期的に受け取る例を次に示します。

 
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.Stream, ProtocolType.Tcp)

Dim sender As New IPEndPoint(IPAddress.Any, 0)
Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)

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

[C#] 
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                                  SocketType.Stream,
                                     ProtocolType.Tcp);
   
   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)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());
   }

[C++] 
IPHostEntry* lipa = Dns::Resolve(S"host.contoso.com");
IPEndPoint* lep = new IPEndPoint(lipa->AddressList[0], 11000);

Socket* s = new Socket(lep->Address->AddressFamily,
    SocketType::Stream,
    ProtocolType::Tcp);

IPEndPoint* sender = new IPEndPoint(IPAddress::Any, 0);
EndPoint* tempRemoteEP = __try_cast<EndPoint*>(sender);

try {
    while (true) {
        allDone->Reset();
        StateObject* so2 = new StateObject();
        so2->workSocket = s;
        Console::WriteLine(S"Attempting to Receive data from host.contoso.com");

        s->BeginReceiveFrom(so2->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None, &tempRemoteEP,
            new AsyncCallback(0, &Async_Send_Receive::ReceiveFrom_Callback), so2);    
        allDone->WaitOne();
    }
} catch (Exception* e) {
    Console::WriteLine(e);
}

[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 名前空間 | 非同期呼び出しの組み込み | EndReceiveFrom | AsyncCallback | Callback のサンプル | Bind | Connect | Accept