Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Socket.BeginReceiveFrom(Byte[], Int32, Int32, SocketFlags, EndPoint, AsyncCallback, Object) Method

定義

指定したネットワーク デバイスから、データの非同期の受信を開始します。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 Int32 Int32 Int32

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

size
Int32 Int32 Int32 Int32

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

socketFlags
SocketFlags SocketFlags SocketFlags SocketFlags

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

remoteEP
EndPoint EndPoint EndPoint EndPoint

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

state
Object Object Object 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.

コール スタックの上位にある呼び出し元が、要求された操作のアクセス許可を保持していません。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出すと、システムは別のスレッドを使用して指定されたコールバックメソッドをEndReceiveFrom実行しSocket 、がデータを読み取るか例外をスローするまでブロックします。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してをローカルエンドポイントに明示的BeginReceiveFromにバインドするSocketExceptionか、をスローする必要があります。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.

リモートホストエンドポイントが常に返されることを保証するには、アプリケーションSocketBind SetSocketOptionメソッドを使用してをローカルエンドポイントに明示的にoptionLevelバインドし、パラメーターをにIP設定してメソッドを呼び出します。またIPv6BeginReceiveFromPacketInformation optionValue必要に応じて、パラメーターをに設定し、パラメーターを使用して、メソッドを呼び出す前にこのオプションを有効にします。optionNameTo 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.

適用対象

こちらもご覧ください