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 socketFlags, System::Net::EndPoint ^ % remoteEP, AsyncCallback ^ callback, System::Object ^ state);
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 socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback? callback, object? state);
public IAsyncResult BeginReceiveFrom (byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback callback, 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
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, socketFlags As SocketFlags, ByRef remoteEP As EndPoint, callback As AsyncCallback, state As Object) As 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.

socketFlagssocket_flags
SocketFlags

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

remoteEPremote_end
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.

戻り値

IAsyncResult

非同期の読み取りを参照する 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. パラメーターを使用して、このクラスのインスタンスをメソッドに渡し BeginReceiveFrom state ます。Pass an instance of this class to the BeginReceiveFrom method through the state parameter.

コールバックメソッドは、メソッドを呼び出す必要があり EndReceiveFrom ます。Your callback method should invoke the EndReceiveFrom method. アプリケーションがを呼び出すと BeginReceiveFrom 、システムは別のスレッドを使用して指定されたコールバックメソッドを実行し、 EndReceiveFromSocket データを読み取るか例外をスローするまでブロックします。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 Socket メソッドを使用してをローカルエンドポイントに明示的にバインドするか、をスローする必要があり Bind 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. このエンドポイントを取得する方法の詳細については、「」を参照してください EndReceiveFromFor 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.

リモートホストエンドポイントが常に返されるようにするには、アプリケーションでメソッドを使用してをローカルエンドポイントに明示的にバインドしてから、必要に応じてパラメーターをまたはに設定してメソッドを呼び出す必要があります。また、パラメーターをに設定して、 Socket Bind メソッドを SetSocketOption optionLevel IP 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 パラメーターで指定されたバイト数まで、使用可能な量のデータを読み取ります sizeWith 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.

適用対象

こちらもご覧ください