Socket.AcceptAsync(SocketAsyncEventArgs) Socket.AcceptAsync(SocketAsyncEventArgs) Socket.AcceptAsync(SocketAsyncEventArgs) Socket.AcceptAsync(SocketAsyncEventArgs) Method

定義

受信接続の試行を受け入れる非同期操作を開始します。Begins an asynchronous operation to accept an incoming connection attempt.

public:
 bool AcceptAsync(System::Net::Sockets::SocketAsyncEventArgs ^ e);
public bool AcceptAsync (System.Net.Sockets.SocketAsyncEventArgs e);
member this.AcceptAsync : System.Net.Sockets.SocketAsyncEventArgs -> bool
Public Function AcceptAsync (e As SocketAsyncEventArgs) As Boolean

パラメーター

e
SocketAsyncEventArgs SocketAsyncEventArgs SocketAsyncEventArgs SocketAsyncEventArgs

この非同期ソケット操作に使用する SocketAsyncEventArgs オブジェクト。The SocketAsyncEventArgs object to use for this asynchronous socket operation.

戻り値

I/O 操作が保留中の場合は truetrue if the I/O operation is pending. 操作の完了時に、e パラメーターの Completed イベントが発生します。The Completed event on the e parameter will be raised upon completion of the operation.

I/O 操作が同期的に完了した場合は falsefalse if the I/O operation completed synchronously. この場合、e パラメーターの Completed イベントは発生しません。メソッド呼び出しから制御が戻った直後に、パラメーターとして渡された e オブジェクトを調べて操作の結果を取得できます。The Completed event on the e parameter will not be raised and the e object passed as a parameter may be examined immediately after the method call returns to retrieve the result of the operation.

例外

引数が有効ではありません。An argument is not valid. この例外は、提供されたバッファーのサイズが不足している場合に発生します。This exception occurs if the buffer provided is not large enough. バッファーは、2 * (sizeof(SOCKADDR_STORAGE + 16) バイト以上であることが必要です。The buffer must be at least 2 * (sizeof(SOCKADDR_STORAGE + 16) bytes.

この例外は、複数のバッファーが指定されているときに、BufferList プロパティが null 値ではない場合にも発生します。This exception also occurs if multiple buffers are specified, the BufferList property is not null.

引数が範囲外です。An argument is out of range. この例外は、Count が 0 未満の場合に発生します。The exception occurs if the Count is less than 0.

無効な操作が要求されました。An invalid operation was requested. この例外は、受け入れ側の Socket が接続をリッスンしていない場合、または受け入れられたソケットがバインドされている場合に発生します。This exception occurs if the accepting Socket is not listening for connections or the accepted socket is bound.

AcceptAsync(SocketAsyncEventArgs) メソッドを呼び出す前に、Bind(EndPoint) メソッドと Listen(Int32) メソッドを呼び出す必要があります。You must call the Bind(EndPoint) and Listen(Int32) method before calling the AcceptAsync(SocketAsyncEventArgs) method.

この例外は、ソケットが既に接続されている、またはソケット操作が指定された e パラメーターを使用して既に進行中の場合にも発生します。This exception also occurs if the socket is already connected or a socket operation was already in progress using the specified e parameter.

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

このメソッドには Windows XP 以降が必要です。Windows XP or later is required for this method.

注釈

接続指向プロトコルでは、メソッドAcceptAsyncを使用して、着信接続の試行を非同期的に処理できます。Connection-oriented protocols can use the AcceptAsync method to asynchronously process incoming connection attempts. 接続を非同期に受け入れると、別の実行スレッド内でデータを送受信することができます。Accepting connections asynchronously gives you the ability to send and receive data within a separate execution thread. AcceptAsyncメソッドを呼び出す前に、 Listenメソッドを呼び出して受信接続要求をリッスンし、キューに挿入する必要があります。Before calling the AcceptAsync method, you must call the Listen method to listen for and queue incoming connection requests.

完了が通知されるようにするには、EventHandler<SocketAsyncEventArgs > delegate を実装するコールバックメソッドを作成し、 SocketAsyncEventArgs.Completedイベントにフックする必要があります。To be notified of completion, you must create a callback method that implements the EventHandler<SocketAsyncEventArgs> delegate and hook it to the SocketAsyncEventArgs.Completed event.

System.Net.Sockets.SocketAsyncEventArgsオブジェクトの次のプロパティとイベントが必要です。The following properties and events on the System.Net.Sockets.SocketAsyncEventArgs object are required:

呼び出し元は、 Socket SocketAsyncEventArgs.AcceptSocketプロパティで使用するを指定することによって、 Socket着信接続に使用する既存のを指定できます。The caller can optionally specify an existing Socket to use for the incoming connection by specifying the Socket to use with the SocketAsyncEventArgs.AcceptSocket property.

SocketType AddressFamily Socket ProtocolType SocketAsyncEventArgs.AcceptSocketプロパティが null の場合、新しいは、現在Socketのと同じ、、およびを使用して構築され、プロパティとして設定されます。 SocketAsyncEventArgs.AcceptSocketIf the SocketAsyncEventArgs.AcceptSocket property is null, a new Socket is constructed with the same AddressFamily, SocketType, and ProtocolType as the current Socket and set as the SocketAsyncEventArgs.AcceptSocket property.

呼び出し元は、 SocketAsyncEventArgs.UserToken AcceptAsyncメソッドを呼び出す前に、プロパティを任意のユーザー状態オブジェクトに設定できます。これにより、コールバックメソッドで情報を取得できるようになります。The caller may set the SocketAsyncEventArgs.UserToken property to any user state object desired before calling the AcceptAsync method, so that the information will be retrievable in the callback method. コールバックが1つのオブジェクトよりも多くの情報を必要とする場合は、他の必要な状態情報をメンバーとして保持するために、小さなクラスを作成できます。If the callback needs more information than a single object, a small class can be created to hold the other required state information as members.

必要に応じて、 ConnectAsyncメソッドが成功した後に、ソケットの最初のデータブロックを受け取るバッファーを指定することもできます。Optionally, a buffer may be provided in which to receive the initial block of data on the socket after the ConnectAsync method succeeds. この場合、プロパティはSocketAsyncEventArgs.Buffer 、受信するデータが格納されているバッファーに設定する必要SocketAsyncEventArgs.Countがあります。また、プロパティは、バッファー内で受信するデータの最大バイト数に設定する必要があります。In this case, the SocketAsyncEventArgs.Buffer property needs to be set to the buffer containing the data to receive and the SocketAsyncEventArgs.Count property needs to be set to the maximum number of bytes of data to receive in the buffer. これらのプロパティは、 SocketAsyncEventArgs.SetBufferメソッドを使用して設定できます。These properties can be set using the SocketAsyncEventArgs.SetBuffer method. 渡されたバッファーの一部は、基になる Winsock AcceptEx 呼び出しで使用するために、内部的に使用されます。Part of the buffer passed in will be consumed internally for use by the underlying Winsock AcceptEx call. これは、返されるデータの量が、指定されたSocketAsyncEventArgs.Count System.Net.Sockets.SocketAsyncEventArgsインスタンスのプロパティの値よりも小さいことを意味します。This means that the amount of data returned will always be less than the value of the SocketAsyncEventArgs.Count property on the System.Net.Sockets.SocketAsyncEventArgs instance provided. 内部で使用されるバッファーの量は、ソケットのアドレスファミリによって異なります。The amount of the buffer used internally varies based on the address family of the socket. 必要な最小バッファーサイズは288バイトです。The minimum buffer size required is 288 bytes. より大きなバッファーサイズが指定されているSocket場合、では、Winsock AcceptEx 呼び出しによって受信されたアドレスデータ以外の追加データが必要になり、この追加データが受信されるまで待機します。If a larger buffer size is specified, then the Socket will expect some extra data other than the address data received by the Winsock AcceptEx call and will wait until this extra data is received. タイムアウトが発生した場合、接続はリセットされます。If a timeout occurs, the connection is reset. したがって、余分なデータが特定の量になることが予想される場合は、バッファーサイズを最小バッファーサイズに設定し、この量を加算する必要があります。So if extra data is expected of a specific amount, then the buffer size should be set to the minimum buffer size plus this amount.

完了コールバックメソッドは、 SocketAsyncEventArgs.SocketErrorプロパティを調べて、 AcceptAsync操作が成功したかどうかを確認する必要があります。The completion callback method should examine the SocketAsyncEventArgs.SocketError property to determine if the AcceptAsync operation was successful.

イベントSocketAsyncEventArgs.Completedは、接続が受け入れらSocketAsyncEventArgs.SocketErrorれず、プロパティがにConnectionReset設定される場合に発生することがあります。The SocketAsyncEventArgs.Completed event can occur in some cases when no connection has been accepted and cause the SocketAsyncEventArgs.SocketError property to be set to ConnectionReset. これは、ハーフオープンの SYN タイプスキャンを使用したポートスキャンの結果として発生する可能性があります (SYN > SYN-ACK-> RST シーケンス)。This can occur as a result of port scanning using a half-open SYN type scan (a SYN -> SYN-ACK -> RST sequence). この条件をAcceptAsync処理するには、メソッドを使用するアプリケーションを準備する必要があります。Applications using the AcceptAsync method should be prepared to handle this condition.

適用対象

こちらもご覧ください