Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) メソッド

定義

指定したネットワーク デバイスから、データの非同期の受信を開始します。Begins to asynchronously receive data from a specified network device.

public:
 IAsyncResult ^ BeginReceiveFrom(cli::array <System::Byte> ^ buffer, int offset, int size, System::Net::Sockets::SocketFlags socket_flags, System::Net::EndPoint ^ % remote_end, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socket_flags, ref System.Net.EndPoint remote_end, AsyncCallback callback, object state);
member this.BeginReceiveFrom : byte[] * int * int * System.Net.Sockets.SocketFlags * EndPoint * AsyncCallback * obj -> IAsyncResult
Public Function BeginReceiveFrom (buffer As Byte(), offset As Integer, size As Integer, socket_flags As SocketFlags, ByRef remote_end As EndPoint, callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

buffer
Byte[]

受信したデータの保存場所となる Byte 型の配列。An array of type Byte that is the storage location for the received data.

offset
Int32

データを格納する、bufferパラメーター内の、インデックス番号が 0 から始まる位置。The zero-based position in the buffer parameter at which to store the data.

size
Int32

受信するバイト数。The number of bytes to receive.

socketFlags
SocketFlags

SocketFlags 値のビットごとの組み合わせ。A bitwise combination of the SocketFlags values.

remoteEP
EndPoint

データのソースを表す EndPointAn EndPoint that represents the source of the data.

callback
AsyncCallback

AsyncCallback デリゲート。The AsyncCallback delegate.

state
Object

この要求の状態情報を格納するオブジェクト。An object that contains state information for this request.

戻り値

非同期の読み取りを参照する IAsyncResultAn IAsyncResult that references the asynchronous read.

例外

buffernullです。buffer is null.

- または --or- remoteEPnullです。remoteEP is null.

ソケットへのアクセスを試行しているときにエラーが発生しました。An error occurred when attempting to access the socket.

offset が 0 未満です。offset is less than 0.

- または --or- offsetbuffer の長さを超えています。offset is greater than the length of buffer.

- または --or- size が 0 未満です。size is less than 0.

- または --or- size が、 buffer の長さから offset パラメーターの値を引いた値を超えています。size is greater than the length of buffer minus the value of the offset parameter.

Socket が閉じられました。The Socket has been closed.

呼び出し履歴の上位にある呼び出し元には、要求された操作に対するアクセス許可がありません。A caller higher in the call stack does not have permission for the requested operation.

次のコード例では、リモートホストからコネクションレスのデータグラムを非同期的に受信します。The following code example asynchronously receives connectionless datagrams from a remote host.

IPHostEntry^ lipa = Dns::Resolve( "host.contoso.com" );
IPEndPoint^ lep = gcnew IPEndPoint( lipa->AddressList[ 0 ], 11000);

   Socket^ s = gcnew Socket( lep->Address->AddressFamily,
      SocketType::Dgram,
      ProtocolType::Udp);
   
   IPEndPoint^ sender = gcnew IPEndPoint( IPAddress::Any, 0 );
   EndPoint^ tempRemoteEP = (EndPoint^)( sender );
   s->Connect( sender );
   
   try{
      while(true){
         allDone->Reset();
         StateObject^ so2 = gcnew StateObject();
             so2->workSocket = s;
             Console::WriteLine( "Attempting to Receive data from host.contoso.com" );
         
             s->BeginReceiveFrom( so2->buffer, 0, StateObject::BUFFER_SIZE, SocketFlags::None, tempRemoteEP,
            gcnew AsyncCallback( &Async_Send_Receive::ReceiveFrom_Callback), so2);	
             allDone->WaitOne();
        }
   }
   catch ( Exception^ e )
   {
        Console::WriteLine( e );
   }
IPHostEntry lipa = Dns.Resolve("host.contoso.com");
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0], 11000);

   Socket s = new Socket(lep.Address.AddressFamily,
                               SocketType.Dgram,
                                     ProtocolType.Udp);
   
   IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
   EndPoint tempRemoteEP = (EndPoint)sender;
   s.Connect(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());
   }
   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.DGram, ProtocolType.Udp)
   
   Dim sender As New IPEndPoint(IPAddress.Any, 0)
   Dim tempRemoteEP As EndPoint = CType(sender, EndPoint)
   s.Connect(sender)
   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

注釈

BeginReceiveFrom メソッドは、リモートホストからのコネクションレスデータグラムの非同期読み取りを開始します。The BeginReceiveFrom method starts asynchronously reading connectionless datagrams from a remote host. BeginReceiveFrom メソッドを呼び出すと、別の実行スレッド内でデータを受け取ることができます。Calling the BeginReceiveFrom method gives you the ability to receive data within a separate execution thread.

AsyncCallback デリゲートを実装するコールバックメソッドを作成し、その名前を BeginReceiveFrom メソッドに渡すことができます。You can create a callback method that implements the AsyncCallback delegate and pass its name to the BeginReceiveFrom method. これを行うには、少なくとも、state パラメーターに、通信に使用される接続された Socket または既定のが含まれている必要があります。To do this, at the very minimum, your state parameter must contain the connected or default Socket being used for communication. コールバックでより多くの情報が必要な場合は、Socket とその他の必要な情報を保持する小さいクラスを作成できます。If your callback needs more information, you can create a small class to hold the Socket and the other required information. state パラメーターを使用して、このクラスのインスタンスを BeginReceiveFrom メソッドに渡します。Pass an instance of this class to the BeginReceiveFrom method through the state parameter.

コールバックメソッドは、EndReceiveFrom メソッドを呼び出す必要があります。Your callback method should invoke the EndReceiveFrom method. アプリケーションが BeginReceiveFromを呼び出すと、システムは別のスレッドを使用して指定されたコールバックメソッドを実行し、Socket がデータを読み取るか例外をスローするまで、EndReceiveFrom でブロックされます。When your application calls BeginReceiveFrom, the system will use a separate thread to execute the specified callback method, and it will block on EndReceiveFrom until the Socket reads data or throws an exception. BeginReceiveFrom メソッドを呼び出した後に元のスレッドがブロックされるようにするには、WaitHandle.WaitOneを使用します。If you want the original thread to block after you call the BeginReceiveFrom method, use WaitHandle.WaitOne. 元のスレッドの実行を継続する場合は、コールバックメソッドの T:System.Threading.ManualResetEvent に対して Set メソッドを呼び出します。Call the Set method on a T:System.Threading.ManualResetEvent in the callback method when you want the original thread to continue executing. コールバックメソッドの記述の詳細については、「コールバックメソッドとしてのデリゲートのマーシャリング」を参照してください。For additional information on writing callback methods, see Marshaling a Delegate as a Callback Method.

注意

BeginReceiveFromを呼び出す前に、Bind メソッドを使用して Socket をローカルエンドポイントに明示的にバインドする必要があります。この操作を行わないと、BeginReceiveFromSocketExceptionをスローします。Before calling BeginReceiveFrom, you must explicitly bind the Socket to a local endpoint using the Bind method, or BeginReceiveFrom will throw a SocketException.

このメソッドは、データを buffer パラメーターに読み込み、データの送信元のリモートホストエンドポイントをキャプチャします。This method reads data into the buffer parameter, and captures the remote host endpoint from which the data is sent. このエンドポイントを取得する方法の詳細については、「EndReceiveFrom」を参照してください。For information on how to retrieve this endpoint, refer to EndReceiveFrom. このメソッドは、不明なホストまたは複数のホストからコネクションレスのデータグラムを非同期的に受信する場合に最も役立ちます。This method is most useful if you intend to asynchronously receive connectionless datagrams from an unknown host or multiple hosts. このような場合、BeginReceiveFrom は、ローカルネットワークバッファーに受信した最初のエンキューされたデータグラムを読み取ります。In these cases, BeginReceiveFrom will read the first enqueued datagram received into the local network buffer. 受信したデータグラムが bufferのサイズより大きい場合、BeginReceiveFrom メソッドは、可能な限り多くのメッセージを buffer に入力し、SocketExceptionをスローします。If the datagram you receive is larger than the size of buffer, the BeginReceiveFrom method will fill buffer with as much of the message as is possible, and throw a SocketException. 信頼性の低いプロトコルを使用している場合は、余分なデータが失われます。If you are using an unreliable protocol, the excess data will be lost. 信頼できるプロトコルを使用している場合は、余分なデータがサービスプロバイダーによって保持され、十分な大きさのバッファーを使用して BeginReceiveFrom メソッドを呼び出すことで取得できます。If you are using a reliable protocol, the excess data will be retained by the service provider and you can retrieve it by calling the BeginReceiveFrom method with a large enough buffer.

リモートホストエンドポイントが常に返されるようにするには、アプリケーションで Bind メソッドを使用してローカルエンドポイントに Socket を明示的にバインドし、optionLevel パラメーターを IP に設定して SetSocketOption メソッドを呼び出すか、IPv6 としてします。適切、optionName パラメーターを PacketInformationに設定し、optionValue パラメーターを使用して、BeginReceiveFrom メソッドを呼び出す前にこのオプションを有効にします。To guarantee that the remote host endpoint is always returned, an application should explicitly bind the Socket to a local endpoint using the Bind method and then call the SetSocketOption method with the optionLevel parameter set to IP or IPv6 as appropriate, the optionName parameter set to PacketInformation, and the optionValue parameter to enable this option before calling the BeginReceiveFrom method. そうしないと、受信側が BeginReceiveFrom メソッドを呼び出した後に、送信者が複数のデータグラムを送信した場合に、リモートホストエンドポイントが返されない可能性があります。Otherwise, it is possible for the remote host endpoint to not be returned when the sender has sent a number of datagrams before the receiver has called the BeginReceiveFrom method.

BeginReceiveFrom はコネクションレスプロトコルを対象としていますが、接続指向プロトコルを使用することもできます。Although BeginReceiveFrom is intended for connectionless protocols, you can use a connection-oriented protocol as well. これを選択する場合は、最初に Connect / BeginConnect メソッドを呼び出すか、Accept または BeginAccept メソッドを呼び出して受信接続要求を受け入れることによって、リモートホスト接続を確立する必要があります。If you choose to do so, you must first either establish a remote host connection by calling the Connect / BeginConnect method or accept an incoming connection request by calling the Accept or BeginAccept method. 接続を確立または受け入れる前に BeginReceiveFrom メソッドを呼び出すと、SocketExceptionが表示されます。If you call the BeginReceiveFrom method before establishing or accepting a connection, you will get a SocketException. BeginReceiveFrom メソッドを呼び出す前に、コネクションレスプロトコルの既定のリモートホストを確立することもできます。You can also establish a default remote host for a connectionless protocol prior to calling the BeginReceiveFrom method. どちらの場合も、BeginReceiveFrom メソッドは、remoteEP パラメーターを無視し、接続されたまたは既定のリモートホストからのデータのみを受信します。In either of these cases, the BeginReceiveFrom method will ignore the remoteEP parameter and only receive data from the connected or default remote host.

接続指向のソケットでは、BeginReceiveFrom は、size パラメーターで指定されたバイト数まで、使用可能な量のデータを読み取ります。With connection-oriented sockets, BeginReceiveFrom will read as much data as is available up to the number of bytes specified by the size parameter.

保留中の BeginReceiveFromを取り消すには、Close メソッドを呼び出します。To cancel a pending BeginReceiveFrom, call the Close method.

注意

SocketExceptionを受け取った場合は、SocketException.ErrorCode プロパティを使用して、特定のエラーコードを取得します。If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. このコードを取得したら、 Windows Sockets version 2 API エラーコードのドキュメントを参照して、エラーの詳細な説明を参照してください。After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

注意

このメンバーは、アプリケーションでネットワーク トレースが有効にされている場合にトレース情報を出力します。This member outputs trace information when you enable network tracing in your application. 詳細については、「 .NET Framework のネットワークトレース」を参照してください。For more information, see Network Tracing in the .NET Framework.

注意

非同期 Socket メソッドに対して、実行コンテキスト (セキュリティコンテキスト、権限を借用したユーザー、および呼び出し元のコンテキスト) がキャッシュされます。The execution context (the security context, the impersonated user, and the calling context) is cached for the asynchronous Socket methods. 特定のコンテキスト (特定の非同期 Socket メソッド、特定の Socket インスタンス、および特定のコールバック) を初めて使用した後、そのコンテキストを使用すると、パフォーマンスが向上します。After the first use of a particular context (a specific asynchronous Socket method, a specific Socket instance, and a specific callback), subsequent uses of that context will see a performance improvement.

適用対象

こちらもご覧ください