次の方法で共有


Socket.ReceiveFrom メソッド (Byte , Int32, SocketFlags, EndPoint)

指定した SocketFlags を使用し、指定したバイト数のデータを受信してデータ バッファに格納します。さらに、エンドポイントを格納します。

Overloads Public Function ReceiveFrom( _
   ByVal buffer() As Byte, _   ByVal size As Integer, _   ByVal socketFlags As SocketFlags, _   ByRef remoteEP As EndPoint _) As Integer
[C#]
public int ReceiveFrom(byte[] buffer,intsize,SocketFlagssocketFlags,   ref EndPointremoteEP);
[C++]
public: int ReceiveFrom(unsigned charbuffer __gc[],intsize,SocketFlagssocketFlags,   EndPoint** remoteEP);
[JScript]
public function ReceiveFrom(
   buffer : Byte[],size : int,socketFlags : SocketFlags,remoteEP : EndPoint) : int;

パラメータ

  • buffer
    受信したデータのストレージ場所となる Byte 型の配列。
  • size
    受信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。
  • remoteEP
    リモート サーバーを表す、参照渡しされた EndPoint

戻り値

受信したバイト数。

例外

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

または

remoteEP が null 参照 (Nothing) です。

ArgumentOutOfRangeException size が 0 未満です。

または

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

SocketException socketFlags が、値の有効な組み合わせではありません。

または

LocalEndPoint プロパティが設定されていませんでした。

または

Socket にアクセス中にオペレーティング システム エラーが発生しました。

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

解説

ReceiveFrom メソッドは、 buffer パラメータにデータを読み込み、正常に読み込まれたバイト数を返し、データの送信元のリモート ホスト エンドポイントをキャプチャします。このメソッドは、不明なホストまたは複数のホストからコネクションレスのデータグラムを受信する場合に便利です。

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

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

読み取ることができるデータが存在しない場合、 ReceiveFrom メソッドは読み取ることができるデータが出現するまでブロックします。非ブロッキング モードにあり、プロトコル スタック バッファに使用できるデータがない場合、 ReceiveFrom はすぐに終了し、 SocketException をスローします。 Available プロパティを使用すると、読み取ることができるデータがあるかどうかを確認できます。 Available が 0 以外の場合は、受信操作を再試行してください。

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

コネクション指向のソケットを使用する場合、 ReceiveFrom は、 size パラメータで指定したバイト数までの、使用可能なデータをすべて読み取ります。リモート ホストが Shutdown メソッドで Socket 接続をシャットダウンし、使用できるデータがすべて受信されると、 ReceiveFrom メソッドはすぐに完了して、0 バイトを返します。

メモ    ReceiveFrom を呼び出す前に、 Bind メソッドを使用して、 Socket を明示的にローカル エンドポイントにバインディングする必要があります。これをしない場合は、 ReceiveFromSocketException をスローします。 SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。

メモ   ReceiveFrom で使用される EndPoint の AddressFamily は、SendTo で使用される EndPoint の AddressFamily に一致する必要があります。

使用例

[Visual Basic, C#, C++] リモート ホストからコネクションレスのデータグラムを受信する例を次に示します。バッファ サイズと SocketFlagsReceiveFrom メソッドに渡されます。

 
Public Shared Sub ReceiveFrom3()
    Dim hostEntry As IPHostEntry = Dns.Resolve(Dns.GetHostName())
    Dim endPoint As New IPEndPoint(hostEntry.AddressList(0), 11000)
    
    Dim s As New Socket(endPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
    
    ' Creates an IPEndPoint to capture the identity of the sending host.
    Dim sender As New IPEndPoint(IPAddress.Any, 0)
    Dim senderRemote As EndPoint = CType(sender, EndPoint)
    
    ' Binding is required with ReceiveFrom calls.
    s.Bind(endPoint)
    
    Dim msg() As Byte = New [Byte](255) {}
    Console.WriteLine("Waiting to receive datagrams from client...")
    ' This call blocks. 
    s.ReceiveFrom(msg, msg.Length, SocketFlags.None, senderRemote)
    s.Close()
End Sub 'ReceiveFrom3


[C#] 
public static void ReceiveFrom3()
{
    IPHostEntry hostEntry = Dns.Resolve(Dns.GetHostName());
    IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 11000);

    Socket s = new Socket(endPoint.Address.AddressFamily,
        SocketType.Dgram,
        ProtocolType.Udp);
  
    // Creates an IPEndPoint to capture the identity of the sending host.
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint senderRemote = (EndPoint)sender;
    
    // Binding is required with ReceiveFrom calls.
    s.Bind(endPoint);
    
    byte[] msg = new Byte[256];
    Console.WriteLine ("Waiting to receive datagrams from client...");
    // This call blocks. 
    s.ReceiveFrom(msg, msg.Length, SocketFlags.None, ref senderRemote);
    s.Close();
}

[C++] 
static void ReceiveFrom3()
{
    IPHostEntry* hostEntry = Dns::Resolve(Dns::GetHostName());
    IPEndPoint* endPoint = new IPEndPoint(hostEntry->AddressList[0], 11000);

    Socket* s = new Socket(endPoint->Address->AddressFamily,
        SocketType::Dgram,
        ProtocolType::Udp);
  
    // Creates an IPEndPoint to capture the identity of the sending host.
    IPEndPoint* sender = new IPEndPoint(IPAddress::Any, 0);
    EndPoint* senderRemote = __try_cast<EndPoint*>(sender);
    
    // Binding is required with ReceiveFrom calls.
    s->Bind(endPoint);
    
    Byte msg[]= new Byte[256];
    Console::WriteLine ("SWaiting to receive datagrams from client...");
    // This call blocks. 
    s->ReceiveFrom(msg, msg.Length, SocketFlags::None, &senderRemote);
    s->Close();
}

[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

.NET Framework セキュリティ:

参照

Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | Socket.ReceiveFrom オーバーロードの一覧 | Connect | Receive | Available | Shutdown | Close | SocketFlags