データグラムを受信してデータバッファに格納します。さらに、エンドポイントを格納します。
Overloads Public Function ReceiveFrom( _
ByVal buffer() As Byte, _ ByRef remoteEP As EndPoint _) As Integer
[C#]
public int ReceiveFrom(byte[] buffer, ref EndPointremoteEP);
[C++]
public: int ReceiveFrom(unsigned charbuffer __gc[], EndPoint** remoteEP);
[JScript]
public function ReceiveFrom(
buffer : Byte[],remoteEP : EndPoint) : int;
パラメータ
戻り値
受信したバイト数。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | buffer が null 参照 (Visual Basic では Nothing) です。
または remoteEP が null 参照 (Nothing) です。 |
SocketException | ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。 |
ObjectDisposedException | Socket は閉じられています。 |
SecurityException | コール スタック内の呼び出し元が、要求されたアクセス許可を保持していません。 |
解説
ReceiveFrom メソッドは、 buffer パラメータにデータを読み込み、正常に読み込まれたバイト数を返し、データの送信元のリモート ホスト エンドポイントをキャプチャします。このメソッドは、不明なホストまたは複数のホストからコネクションレスのデータグラムを受信する場合に便利です。
このオーバーロードには、受信 buffer と、リモート ホストを表す EndPoint だけが必要です。バッファのオフセットの既定値は 0、サイズの既定値は buffer パラメータの長さであり、および socketFlags の既定値は None です。
メモ ReceiveFrom を呼び出す前に、 Bind メソッドを使用して、 Socket を明示的にローカル エンドポイントにバインディングする必要があります。これをしない場合は、 ReceiveFrom が SocketException をスローします。
コネクションレス プロトコルの場合、 ReceiveFrom は、ローカル ネットワーク バッファに受信されたデータグラムのうち、最初にキューに格納されたデータグラムを読み取ります。受信するデータグラムのサイズが buffer より大きい場合、 ReceiveFrom メソッドはできる限りのメッセージを buffer に格納しますが、 SocketException をスローします。信頼性のないプロトコルを使用している場合、超過データは失われます。信頼性のあるプロトコルを使用している場合、超過データはサービス プロバイダによって保持されるため、十分に大きなバッファを使用して ReceiveFrom メソッドを呼び出すことによって、超過データを取得できます。
読み取ることができるデータが存在しない場合、 ReceiveFrom メソッドは読み取ることができるデータが出現するまでブロックします。非ブロッキング モードにあり、プロトコル スタック バッファに使用できるデータがない場合、 ReceiveFrom はすぐに終了し、 SocketException をスローします。 Available プロパティを使用すると、読み取ることができるデータがあるかどうかを確認できます。 Available が 0 以外の場合は、受信操作を再試行してください。
ReceiveFrom はコネクションレスのプロトコルを想定していますが、コネクション指向のプロトコルにも使用できます。この場合は、 Connect メソッドを呼び出してリモート ホストとの接続を確立するか、 Accept メソッドを呼び出してリモート ホストとの受信接続を受け入れる必要があります。 ReceiveFrom を呼び出す前に接続を確立していないか、受け入れていない場合は、 SocketException が生成されます。また、 ReceiveFrom を呼び出す前に、コネクションレス プロトコルで既定のリモート ホストを確立することもできます。いずれの場合も、 ReceiveFrom メソッドは remoteEP パラメータを無視し、接続されているリモート ホストまたは既定のリモート ホストからのデータだけを受信します。
コネクション指向のソケットを使用する場合、 ReceiveFrom は、 buffer サイズまでの使用可能なデータをすべて読み取ります。リモート ホストが Shutdown メソッドで Socket 接続をシャットダウンし、使用できるデータがすべて受信されると、 ReceiveFrom メソッドはすぐに完了して、0 バイトを返します。
メモ SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。
メモ ReceiveFrom で使用される EndPoint の AddressFamily は、SendTo で使用される EndPoint の AddressFamily に一致する必要があります。
使用例
[Visual Basic, C#, C++] リモート ホストからコネクションレスのデータグラムを受信する例を次に示します。
Public Shared Sub ReceiveFrom1()
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, senderRemote)
s.Close()
End Sub 'ReceiveFrom1
[C#]
public static void ReceiveFrom1()
{
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, ref senderRemote);
s.Close();
}
[C++]
static void ReceiveFrom1()
{
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 (S"Waiting to receive datagrams from client...");
// This call blocks.
s->ReceiveFrom(msg, &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 セキュリティ:
- SocketPermission 。 Accept (関連する列挙体)
参照
Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | Socket.ReceiveFrom オーバーロードの一覧 | Connect | Receive | Available | Shutdown | Close