Socket.BeginAccept Socket.BeginAccept Socket.BeginAccept Socket.BeginAccept Method

定義

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

オーバーロード

BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object)

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

BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object)

受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。Begins an asynchronous operation to accept an incoming connection attempt and receives the first block of data sent by the client application.

BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object)

指定したソケットから受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。Begins an asynchronous operation to accept an incoming connection attempt from a specified socket and receives the first block of data sent by the client application.

BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object) BeginAccept(AsyncCallback, Object)

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

public:
 IAsyncResult ^ BeginAccept(AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginAccept (AsyncCallback callback, object state);
member this.BeginAccept : AsyncCallback * obj -> IAsyncResult
Public Function BeginAccept (callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

state
Object Object Object Object

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

戻り値

非同期の Socket 作成を参照する IAsyncResultAn IAsyncResult that references the asynchronous Socket creation.

例外

Socket オブジェクトは閉じられています。The Socket object has been closed.

このメソッドには Windows NT が必要です。Windows NT is required for this method.

受け入れ元のソケットが、接続をリッスンしていません。The accepting socket is not listening for connections. BeginAccept(AsyncCallback, Object) の前に Bind(EndPoint) および Listen(Int32) を呼び出す必要があります。You must call Bind(EndPoint) and Listen(Int32) before calling BeginAccept(AsyncCallback, Object).

または-or- 受け入れられたソケットがバインドされています。The accepted socket is bound.

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

次のコード例では、受信接続を非同期的に受信しようとしています。The following code example attempts to receive an incoming connection asynchronously.

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

Socket^ s = gcnew Socket( lep->Address->AddressFamily,
   SocketType::Stream,
   ProtocolType::Tcp );
try
{
   s->Bind( lep );
   s->Listen( 1000 );

   while ( true )
   {
      allDone->Reset();

      Console::WriteLine( "Waiting for a connection..." );
      s->BeginAccept( gcnew AsyncCallback( &Async_Send_Receive::Connect_Callback ), s );

      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.Stream,
                                        ProtocolType.Tcp);
      try{
           s.Bind(lep);
           s.Listen(1000);

           while(true){
                allDone.Reset();

                Console.WriteLine("Waiting for a connection...");
                s.BeginAccept(new AsyncCallback(Async_Send_Receive.Listen_Callback), s);

                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.Stream, ProtocolType.Tcp)
   Try
      s.Bind(lep)
      s.Listen(1000)
      
      While True
         allDone.Reset()
         
         Console.WriteLine("Waiting for a connection...")
         s.BeginAccept(New AsyncCallback(AddressOf Async_Send_Receive.Listen_Callback), s)
         
         allDone.WaitOne()
      End While
   Catch e As Exception
      Console.WriteLine(e.ToString())
   End Try
End Sub 'Listen

注釈

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

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

コールバックメソッドは、メソッドEndAcceptを呼び出す必要があります。Your callback method should invoke the EndAccept method. アプリケーションがを呼びBeginAccept出すと、通常、システムは別のスレッドを使用して、指定さEndAcceptれたコールバックメソッドを実行し、保留中の接続が取得されるまでブロックします。When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved. EndAcceptは、リモートホストSocketとの間でデータを送受信するために使用できる新しいオブジェクトを返します。EndAccept will return a new Socket object that you can use to send and receive data with the remote host. この返された値Socketを使用して、接続キューからの追加の接続を受け入れることはできません。You cannot use this returned Socket to accept any additional connections from the connection queue. BeginAcceptメソッドを呼び出した後に元のスレッドがブロックされるようにWaitHandle.WaitOneするには、を使用します。If you want the original thread to block after you call the BeginAccept method, use WaitHandle.WaitOne. 元のスレッドの実行をManualResetEvent継続する場合は、コールバックメソッドので Set メソッドを呼び出します。Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing.

また、呼び出し元のスレッドを使用してコールバックメソッドを呼び出すこともできます。The system may also use the calling thread to invoke the callback method. この場合、 CompletedSynchronously返さIAsyncResultれるのプロパティは、メソッドがBeginAccept同期的に完了したことを示すように設定されます。In this case, the CompletedSynchronously property on the returned IAsyncResult will be set to indicate that the BeginAccept method completed synchronously.

コールバックメソッドの記述の詳細については、「コールバックメソッドとしてのデリゲートのマーシャリング」を参照してください。For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

BeginAcceptメソッドへの保留中の呼び出しを取り消すにはSocket、を閉じます。To cancel a pending call to the BeginAccept method, close the Socket. 非同期操作の実行中にBeginAccept メソッドが呼び出されると、メソッドに渡されたコールバックが呼び出されます。CloseWhen the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドのEndAccept呼び出しでは、操作が取り消されたことを示すためにがObjectDisposedExceptionスローされます。A subsequent call to the EndAccept method will throw an ObjectDisposedException to indicate that the operation has been cancelled.

注意

返されRemoteEndPoint Socketたのプロパティを使用して、リモートホストのネットワークアドレスとポート番号を識別できます。You can use the RemoteEndPoint property of the returned Socket to identify the remote host's network address and port number.

注意

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.

こちらもご覧ください

BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object) BeginAccept(Int32, AsyncCallback, Object)

受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。Begins an asynchronous operation to accept an incoming connection attempt and receives the first block of data sent by the client application.

public:
 IAsyncResult ^ BeginAccept(int receiveSize, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginAccept (int receiveSize, AsyncCallback callback, object state);
member this.BeginAccept : int * AsyncCallback * obj -> IAsyncResult
Public Function BeginAccept (receiveSize As Integer, callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

receiveSize
Int32 Int32 Int32 Int32

送信元から受け入れるバイト数。The number of bytes to accept from the sender.

state
Object Object Object Object

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

戻り値

非同期の Socket 作成を参照する IAsyncResultAn IAsyncResult that references the asynchronous Socket creation.

例外

Socket オブジェクトは閉じられています。The Socket object has been closed.

このメソッドには Windows NT が必要です。Windows NT is required for this method.

受け入れ元のソケットが、接続をリッスンしていません。The accepting socket is not listening for connections. BeginAccept(AsyncCallback, Object) の前に Bind(EndPoint) および Listen(Int32) を呼び出す必要があります。You must call Bind(EndPoint) and Listen(Int32) before calling BeginAccept(AsyncCallback, Object).

- または --or- 受け入れられたソケットがバインドされています。The accepted socket is bound.

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

次のコード例では、ソケットを開き、非同期接続を受け入れます。The following code example opens a socket and accepts an asynchronous connection. この例では、ソケットは最初の10バイトのデータを受け入れます。In this example, the socket accepts the initial 10 bytes of data. 受信したバイト数とデータは、コールバックデリゲートによってコンソールに表示されます。The number of bytes received and the data are displayed on the console by the callback delegate. 残りBeginReceiveのデータを受信する方法の詳細については、「」を参照してください。See BeginReceive for a description of how the remaining data is received.

   // This server waits for a connection and then uses asynchronous operations to
   // accept the connection with initial data sent from the client.
   // Establish the local endpoint for the socket.
   IPHostEntry^ ipHostInfo = Dns::GetHostEntry( Dns::GetHostName() );
   IPAddress^ ipAddress = ipHostInfo->AddressList[ 0 ];
   IPEndPoint^ localEndPoint = gcnew IPEndPoint( ipAddress,11000 );
   
   // Create a TCP/IP socket.
   Socket^ listener = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );
   
   // Bind the socket to the local endpoint, and listen for incoming connections.
   listener->Bind( localEndPoint );
   listener->Listen( 100 );
   for ( ; ;  )
   {
      
      // Set the event to nonsignaled state.
      allDone->Reset();
      
      // Start an asynchronous socket to listen for connections and receive data from the client.
      Console::WriteLine( "Waiting for a connection..." );
      
      // Accept the connection and receive the first 10 bytes of data.
      int receivedDataSize = 10;
      listener->BeginAccept( receivedDataSize, gcnew AsyncCallback( AcceptReceiveCallback ), listener );
      
      // Wait until a connection is made and processed before continuing.
      allDone->WaitOne();

   }
}

static void AcceptReceiveCallback( IAsyncResult^ ar )
{
   // Get the socket that handles the client request.
   Socket^ listener = dynamic_cast<Socket^>(ar->AsyncState);

   // End the operation and display the received data on the console.
   array<Byte>^Buffer;
   int bytesTransferred;
   Socket^ handler = listener->EndAccept( Buffer, bytesTransferred, ar );
   String^ stringTransferred = Encoding::ASCII->GetString( Buffer, 0, bytesTransferred );
   Console::WriteLine( stringTransferred );
   Console::WriteLine( "Size of data transferred is {0}", bytesTransferred );

   // Create the state object for the asynchronous receive.
   StateObject^ state = gcnew StateObject;
   state->workSocket = handler;
   handler->BeginReceive( state->buffer, 0, StateObject::BufferSize, static_cast<SocketFlags>(0), gcnew AsyncCallback( ReadCallback ), state );
}


    // This server waits for a connection and then uses asynchronous operations to
    // accept the connection with initial data sent from the client.
         
    
    // Establish the local endpoint for the socket.

    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
   
    // Create a TCP/IP socket.
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );

    // Bind the socket to the local endpoint, and listen for incoming connections.
    listener.Bind(localEndPoint);
    listener.Listen(100);

    while (true) 
    {
        // Set the event to nonsignaled state.
        allDone.Reset();

        // Start an asynchronous socket to listen for connections and receive data from the client.
        Console.WriteLine("Waiting for a connection...");

        // Accept the connection and receive the first 10 bytes of data.
        int receivedDataSize = 10;
        listener.BeginAccept(receivedDataSize, new AsyncCallback(AcceptReceiveCallback), listener);
         
        // Wait until a connection is made and processed before continuing.
        allDone.WaitOne();
    }

}


public static void AcceptReceiveCallback(IAsyncResult ar) 
{
    // Get the socket that handles the client request.
    Socket listener = (Socket) ar.AsyncState;
    
    // End the operation and display the received data on the console.
    byte[] Buffer;
    int bytesTransferred;
    Socket handler = listener.EndAccept(out Buffer, out bytesTransferred, ar);
    string stringTransferred = Encoding.ASCII.GetString(Buffer, 0, bytesTransferred);

    Console.WriteLine(stringTransferred);
    Console.WriteLine("Size of data transferred is {0}", bytesTransferred);
          
    // Create the state object for the asynchronous receive.
    StateObject state = new StateObject();
    state.workSocket = handler;
    handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
    new AsyncCallback(ReadCallback), state);
}

注釈

接続指向プロトコルでは、メソッドBeginAcceptを使用して、着信接続の試行を非同期的に処理できます。Connection-oriented protocols can use the BeginAccept method to asynchronously process incoming connection attempts. 接続を非同期に受け入れると、別の実行スレッド内でデータを送受信できるようになります。Accepting connections asynchronously enables you to send and receive data within a separate execution thread. このオーバーロードでは、 receiveSizeパラメーターの初期転送時に受け入れるバイト数を指定できます。This overload allows you to specify the number of bytes to accept in the initial transfer in the receiveSize parameter.

BeginAcceptメソッドを呼び出す前に、 Listenメソッドを呼び出して受信接続要求をリッスンし、キューに挿入する必要があります。Before calling the BeginAccept method, you must call the Listen method to listen for and queue incoming connection requests.

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

コールバックメソッドは、メソッドEndAcceptを呼び出す必要があります。Your callback method should invoke the EndAccept method. アプリケーションがを呼びBeginAccept出すと、通常、システムは別のスレッドを使用して、指定さEndAcceptれたコールバックメソッドを実行し、保留中の接続が取得されるまでブロックします。When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved.

EndAcceptリモートホストとSocketの間でデータを送受信するために使用できる新しいを返します。EndAccept returns a new Socket that you can use to send and receive data with the remote host. この返された値Socketを使用して、接続キューからの追加の接続を受け入れることはできません。You cannot use this returned Socket to accept any additional connections from the connection queue. BeginAcceptメソッドを呼び出した後に元のスレッドがブロックされるようにWaitHandle.WaitOneするには、を使用します。If you want the original thread to block after you call the BeginAccept method, use WaitHandle.WaitOne. 元のスレッドの実行をManualResetEvent継続する場合は、コールバックメソッドので Set メソッドを呼び出します。Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing.

また、呼び出し元のスレッドを使用してコールバックメソッドを呼び出すこともできます。The system may also use the calling thread to invoke the callback method. この場合、 CompletedSynchronously返さIAsyncResultれるのプロパティは、メソッドがBeginAccept同期的に完了したことを示すように設定されます。In this case, the CompletedSynchronously property on the returned IAsyncResult will be set to indicate that the BeginAccept method completed synchronously.

コールバックメソッドの記述の詳細については、「コールバックメソッドとしてのデリゲートのマーシャリング」を参照してください。For additional information on writing callback methods see Marshaling a Delegate as a Callback Method.

BeginAcceptメソッドへの保留中の呼び出しを取り消すにはSocket、を閉じます。To cancel a pending call to the BeginAccept method, close the Socket. 非同期操作の実行中にBeginAccept メソッドが呼び出されると、メソッドに渡されたコールバックが呼び出されます。CloseWhen the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドのEndAccept呼び出しでは、操作が取り消されたことを示すためにがObjectDisposedExceptionスローされます。A subsequent call to the EndAccept method will throw an ObjectDisposedException to indicate that the operation has been cancelled.

注意

を呼び出すと、 RemoteEndPoint返されSocketたオブジェクトのプロパティを使用して、リモートホストのネットワークアドレスとポート番号を識別できます。You can call use the RemoteEndPoint property of the returned Socket object to identify the remote host's network address and port number.

注意

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.

こちらもご覧ください

BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object) BeginAccept(Socket, Int32, AsyncCallback, Object)

指定したソケットから受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。Begins an asynchronous operation to accept an incoming connection attempt from a specified socket and receives the first block of data sent by the client application.

public:
 IAsyncResult ^ BeginAccept(System::Net::Sockets::Socket ^ acceptSocket, int receiveSize, AsyncCallback ^ callback, System::Object ^ state);
public IAsyncResult BeginAccept (System.Net.Sockets.Socket acceptSocket, int receiveSize, AsyncCallback callback, object state);
member this.BeginAccept : System.Net.Sockets.Socket * int * AsyncCallback * obj -> IAsyncResult
Public Function BeginAccept (acceptSocket As Socket, receiveSize As Integer, callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

acceptSocket
Socket Socket Socket Socket

受け入れた Socket オブジェクト。The accepted Socket object. この値は null の場合もあります。This value may be null.

receiveSize
Int32 Int32 Int32 Int32

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

state
Object Object Object Object

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

戻り値

非同期の Socket オブジェクトの作成を参照する IAsyncResult オブジェクト。An IAsyncResult object that references the asynchronous Socket object creation.

例外

Socket オブジェクトは閉じられています。The Socket object has been closed.

このメソッドには Windows NT が必要です。Windows NT is required for this method.

受け入れ元のソケットが、接続をリッスンしていません。The accepting socket is not listening for connections. BeginAccept(AsyncCallback, Object) の前に Bind(EndPoint) および Listen(Int32) を呼び出す必要があります。You must call Bind(EndPoint) and Listen(Int32) before calling BeginAccept(AsyncCallback, Object).

または-or- 受け入れられたソケットがバインドされています。The accepted socket is bound.

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

次のコード例では、ソケットを開き、非同期接続を受け入れます。The following code example opens a socket and accepts an asynchronous connection. この例では、ソケットは最初の10バイトのデータacceptSocketを受け入れ、パラメーターはです。これにより、 BeginAcceptメソッドによって、受け入れられたソケットが強制的に作成さnullれます。In this example, the socket accepts the initial 10 bytes of data and the acceptSocket parameter is null, which forces the BeginAccept method to create the accepted socket. 受信したバイト数とデータは、コールバックデリゲートによってコンソールに表示されます。The number of bytes received and the data are displayed on the console by the callback delegate. 残りBeginReceiveのデータを受信する方法の詳細については、「」を参照してください。See BeginReceive for a description of how the remaining data is received.

   // This server waits for a connection and then uses asynchronous operations to
   // accept the connection with initial data sent from the client.
   // Establish the local endpoint for the socket.
   IPHostEntry^ ipHostInfo = Dns::GetHostEntry( Dns::GetHostName() );
   IPAddress^ ipAddress = ipHostInfo->AddressList[ 0 ];
   IPEndPoint^ localEndPoint = gcnew IPEndPoint( ipAddress,11000 );

   // Create a TCP/IP socket.
   Socket^ listener = gcnew Socket( AddressFamily::InterNetwork,SocketType::Stream,ProtocolType::Tcp );

   // Bind the socket to the local endpoint, and listen for incoming connections.
   listener->Bind( localEndPoint );
   listener->Listen( 100 );
   for ( ; ;  )
   {
      // Set the event to nonsignaled state.
      allDone->Reset();

      // Start an asynchronous socket to listen for connections and receive data from the client.
      Console::WriteLine( "Waiting for a connection..." );

      // Accept the connection and receive the first 10 bytes of data. 
      // BeginAccept() creates the accepted socket.
      int receivedDataSize = 10;
      listener->BeginAccept( nullptr, receivedDataSize, gcnew AsyncCallback( AcceptReceiveDataCallback ), listener );

      // Wait until a connection is made and processed before continuing.
      allDone->WaitOne();
   }
}

static void AcceptReceiveDataCallback( IAsyncResult^ ar )
{
   // Get the socket that handles the client request.
   Socket^ listener = dynamic_cast<Socket^>(ar->AsyncState);
   
   // End the operation and display the received data on the console.
   array<Byte>^Buffer;
   int bytesTransferred;
   Socket^ handler = listener->EndAccept( Buffer, bytesTransferred, ar );
   String^ stringTransferred = Encoding::ASCII->GetString( Buffer, 0, bytesTransferred );
   Console::WriteLine( stringTransferred );
   Console::WriteLine( "Size of data transferred is {0}", bytesTransferred );
   
   // Create the state object for the asynchronous receive.
   StateObject^ state = gcnew StateObject;
   state->workSocket = handler;
   handler->BeginReceive( state->buffer, 0, StateObject::BufferSize, static_cast<SocketFlags>(0), gcnew AsyncCallback( ReadCallback ), state );
}

    // This server waits for a connection and then uses asynchronous operations to
    // accept the connection with initial data sent from the client.
               
    // Establish the local endpoint for the socket.

    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

    // Create a TCP/IP socket.
    Socket listener = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp );

    // Bind the socket to the local endpoint, and listen for incoming connections.
    listener.Bind(localEndPoint);
    listener.Listen(100);

    while (true) 
    {
        // Set the event to nonsignaled state.
        allDone.Reset();

        // Start an asynchronous socket to listen for connections and receive data from the client.
        Console.WriteLine("Waiting for a connection...");

        // Accept the connection and receive the first 10 bytes of data. 
        // BeginAccept() creates the accepted socket.
        int receivedDataSize = 10;
        listener.BeginAccept(null, receivedDataSize, new AsyncCallback(AcceptReceiveDataCallback), listener);

        // Wait until a connection is made and processed before continuing.
        allDone.WaitOne();
    }
}



public static void AcceptReceiveDataCallback(IAsyncResult ar) 
{
    // Get the socket that handles the client request.
    Socket listener = (Socket) ar.AsyncState;
    
    // End the operation and display the received data on the console.
    byte[] Buffer;
    int bytesTransferred;
    Socket handler = listener.EndAccept(out Buffer, out bytesTransferred, ar);
    string stringTransferred = Encoding.ASCII.GetString(Buffer, 0, bytesTransferred);

    Console.WriteLine(stringTransferred);
    Console.WriteLine("Size of data transferred is {0}", bytesTransferred);

    // Create the state object for the asynchronous receive.
    StateObject state = new StateObject();
    state.workSocket = handler;
    handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
    new AsyncCallback(ReadCallback), state);
}

注釈

接続指向プロトコルでは、メソッドBeginAcceptを使用して、着信接続の試行を非同期的に処理できます。Connection-oriented protocols can use the BeginAccept method to asynchronously process incoming connection attempts. 接続を非同期に受け入れると、別の実行スレッド内でデータを送受信することができます。Accepting connections asynchronously gives you the ability to send and receive data within a separate execution thread. このオーバーロードでは、 acceptSocketパラメーターで受け入れられたソケットを指定できます。This overload allows you to specify the accepted socket in the acceptSocket parameter. このパラメーターがnullの場合、受け入れられたソケットはBeginAcceptメソッドによって作成されます。If this parameter is null, the accepted socket is created by the BeginAccept method. receiveSizeパラメーターでは、初期転送時に受け入れるバイト数を指定できます。You can specify the number of bytes to accept in the initial transfer in the receiveSize parameter.

BeginAcceptメソッドを呼び出す前に、 Listenメソッドを呼び出して受信接続要求をリッスンし、キューに挿入する必要があります。Before calling the BeginAccept method, you must call the Listen method to listen for and queue incoming connection requests.

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

コールバックメソッドは、メソッドEndAcceptを呼び出す必要があります。Your callback method should invoke the EndAccept method. アプリケーションがを呼びBeginAccept出すと、通常、システムは別のスレッドを使用して、指定さEndAcceptれたコールバックメソッドを実行し、保留中の接続が取得されるまでブロックします。When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved.

EndAcceptリモートホストとSocketの間でデータを送受信するために使用できる新しいオブジェクトを返します。EndAccept returns a new Socket object that you can use to send and receive data with the remote host. この返された値Socketを使用して、接続キューからの追加の接続を受け入れることはできません。You cannot use this returned Socket to accept any additional connections from the connection queue. BeginAcceptメソッドを呼び出した後に元のスレッドがブロックされるようにWaitHandle.WaitOneするには、を使用します。If you want the original thread to block after you call the BeginAccept method, use WaitHandle.WaitOne. 元のスレッドの実行をManualResetEvent継続する場合は、コールバックメソッドので Set メソッドを呼び出します。Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing.

また、呼び出し元のスレッドを使用してコールバックメソッドを呼び出すこともできます。The system may also use the calling thread to invoke the callback method. この場合、 CompletedSynchronously返さIAsyncResultれるのプロパティは、メソッドがBeginAccept同期的に完了したことを示すように設定されます。In this case, the CompletedSynchronously property on the returned IAsyncResult will be set to indicate that the BeginAccept method completed synchronously.

コールバックメソッドの記述の詳細については、「コールバックメソッドとしてのデリゲートのマーシャリング」を参照してください。For additional information on writing callback methods, see Marshaling a Delegate as a Callback Method.

BeginAcceptメソッドへの保留中の呼び出しを取り消すにはSocket、を閉じます。To cancel a pending call to the BeginAccept method, close the Socket. 非同期操作の実行中にBeginAccept メソッドが呼び出されると、メソッドに渡されたコールバックが呼び出されます。CloseWhen the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドのEndAccept呼び出しでは、操作が取り消されたことを示すためにがObjectDisposedExceptionスローされます。A subsequent call to the EndAccept method will throw an ObjectDisposedException to indicate that the operation has been cancelled.

注意

返されRemoteEndPoint Socketたオブジェクトのプロパティを使用して、リモートホストのネットワークアドレスとポート番号を識別できます。You can use the RemoteEndPoint property of the returned Socket object to identify the remote host's network address and port number.

注意

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.

こちらもご覧ください

適用対象