次の方法で共有


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

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

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

パラメータ

  • buffer
    受信したデータのストレージ場所となる Byte 型の配列。
  • offset
    受信データを格納する buffer 内の場所。
  • size
    受信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。

戻り値

受信したバイト数。

例外

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

または

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

または

size が 0 未満です。

または

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

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

または

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

または

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

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

解説

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

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 のデータを受信する前に、データ バッファ、オフセット、サイズ、およびソケット フラグを指定する例を次に示します。

 
' Displays sending with a connected socket
' using the overload that takes a buffer, offset, message size, and socket flags.
Public Shared Function SendReceiveTest4(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, 0, msg.Length, SocketFlags.None)
        Console.WriteLine("Sent {0} bytes.", i)
        
        ' Get reply from the server.
        server.Receive(bytes, 0, server.Available, 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 'SendReceiveTest4


[C#] 
// Displays sending with a connected socket
// using the overload that takes a buffer, offset, message size, and socket flags.
public static int SendReceiveTest4(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, 0, msg.Length, SocketFlags.None);
        Console.WriteLine("Sent {0} bytes.", i);
        
        // Get reply from the server.
        server.Receive(bytes, 0, server.Available, 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, offset, message size, and socket flags.
int SendReceiveTest4(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, 0, msg.Length, SocketFlags::None);
        Console::WriteLine(S"Sent {0} bytes.", i.ToString());
        
        // Get reply from the server.
        server->Receive(bytes, 0, server->Available, SocketFlags::None);
        Console::WriteLine(Encoding::UTF8->GetString(bytes));
    }
    catch (SocketException* e)
    {
        Console::WriteLine("{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