次の方法で共有


Socket.Receive メソッド (Byte , SocketFlags)

指定した SocketFlags を使用し、バインドされた Socket からデータを受信して受信バッファに格納します。

Overloads Public Function Receive( _
   ByVal buffer() As Byte, _   ByVal socketFlags As SocketFlags _) As Integer
[C#]
public int Receive(byte[] buffer,SocketFlagssocketFlags);
[C++]
public: int Receive(unsigned charbuffer __gc[],SocketFlagssocketFlags);
[JScript]
public function Receive(
   buffer : Byte[],socketFlags : SocketFlags) : int;

パラメータ

  • buffer
    受信したデータのストレージ場所となる Byte 型の配列。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。

戻り値

受信したバイト数。

例外

例外の種類 条件
ArgumentNullException buffer が null 参照 (Visual Basic では Nothing) です。
SocketException ソケットへのアクセスを試みているときにエラーが発生しました。詳細については、「解説」を参照してください。
ObjectDisposedException Socket は閉じられています。
SecurityException コール スタック内の呼び出し元が、要求されたアクセス許可を保持していません。

解説

Receive メソッドは、データをバッファ パラメータに読み込み、正常に読み込まれたバイト数を返します。コネクション指向のソケットおよびコネクションレスのソケットの両方から Receive を呼び出すことができます。

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

コネクション指向のプロトコルを使用する場合は、 Connect を呼び出してリモート ホストとの接続を確立するか、 Receive を呼び出す前に Accept を呼び出して受信接続を受け入れる必要があります。 Receive メソッドは、 Connect メソッドまたは Accept メソッドで確立されたリモート ホストから送信されたデータだけを読み取ります。コネクションレスのプロトコルを使用している場合は、 ReceiveFrom メソッドも使用できます。 ReceiveFrom を使用すると、どのホストから送信されたデータでも受信できます。

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

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

コネクションレスの Socket を使用している場合、 Receive は、 Connect メソッドで指定した接続先のアドレスから、最初にキューに格納されたデータグラムを読み取ります。受信するデータグラムのサイズが buffer パラメータのサイズより大きい場合、 buffer にはメッセージの最初の部分が格納されますが、超過するデータは失われ、 SocketException がスローされます。

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

使用例

[Visual Basic, C#, C++] データ バッファおよび接続された Socket の受信データの SocketFlags を指定する例を次に示します。

 
' Displays sending with a connected socket
' using the overload that takes a buffer and socket flags.
Public Shared Function SendReceiveTest2(server As Socket) As Integer
    Dim msg As Byte() = Encoding.UTF8.GetBytes("This is a test")
    Dim bytes(255) As Byte
    Try
        ' Blocks until send returns.
        Dim i As Integer = server.Send(msg, SocketFlags.None)
        Console.WriteLine("Sent {0} bytes.", i)
        
        ' Get reply from the server.
        i = server.Receive(bytes, SocketFlags.None)
        Console.WriteLine(Encoding.UTF8.GetString(bytes))
    Catch e As SocketException
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode)
        Return e.ErrorCode
    End Try
    Return 0
End Function 'SendReceiveTest2


[C#] 
// Displays sending with a connected socket
// using the overload that takes a buffer and socket flags.
public static int SendReceiveTest2(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg, SocketFlags.None);
        Console.WriteLine("Sent {0} bytes.", i);
        
        // Get reply from the server.
        i = server.Receive(bytes, SocketFlags.None);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}

[C++] 
// Displays sending with a connected socket
// using the overload that takes a buffer and socket flags.
int SendReceiveTest2(Socket* server)
{
    Byte msg[]= Encoding::UTF8->GetBytes(S"This is a test");
    Byte bytes[] = new Byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server->Send(msg, SocketFlags::None);
        Console::WriteLine(S"Sent {0} bytes.", i.ToString());
        
        // Get reply from the server.
        i = server->Receive(bytes, SocketFlags::None);
        Console::WriteLine(Encoding::UTF8->GetString(bytes));
    }
    catch (SocketException* e)
    {
        Console::WriteLine(S"{0} Error code: {1}.", e->Message, e->ErrorCode.ToString());
        return (e->ErrorCode);
    }
    return 0;
}

[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.Receive オーバーロードの一覧 | Connect | ReceiveFrom | Available | Shutdown | Close