Socket.BeginAccept メソッド

定義

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

オーバーロード

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)

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

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)

指定したソケットから受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。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);
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 オブジェクト。The accepted Socket object. この値は null の場合もあります。This value may be null.

receiveSize
Int32

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

callback
AsyncCallback

AsyncCallback デリゲート。The AsyncCallback delegate.

state
Object

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

戻り値

IAsyncResult

非同期の 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.

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

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

次のコード例では、ソケットを開き、非同期接続を受け入れます。The following code example opens a socket and accepts an asynchronous connection. この例では、ソケットは最初の10バイトのデータを受け入れ、 acceptSocket パラメーターはです。これにより、メソッドによって nullBeginAccept 受け入れられたソケットが強制的に作成されます。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 BeginAccept state ます。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. パラメーターを使用して、このクラスのインスタンスをメソッドに渡し BeginAccept state ます。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.

EndAcceptSocketリモートホストとの間でデータを送受信するために使用できる新しいオブジェクトを返します。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. Close非同期操作の実行中にメソッドが呼び出されると、メソッドに渡されたコールバック BeginAccept が呼び出されます。When the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドの呼び出しでは EndAcceptObjectDisposedException 操作が取り消されたことを示すためにがスローされます。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.

こちらもご覧ください

適用対象

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);
public IAsyncResult BeginAccept (AsyncCallback callback, object state);
member this.BeginAccept : AsyncCallback * obj -> IAsyncResult
Public Function BeginAccept (callback As AsyncCallback, state As Object) As IAsyncResult

パラメーター

callback
AsyncCallback

AsyncCallback デリゲート。The AsyncCallback delegate.

state
Object

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

戻り値

IAsyncResult

非同期の 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.

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

ソケットへのアクセスを試行しているときにエラーが発生しました。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

注釈

接続指向プロトコルでは、メソッドを使用して、 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 BeginAccept state ます。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. パラメーターを使用して、このクラスのインスタンスをメソッドに渡し BeginAccept state ます。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. Close非同期操作の実行中にメソッドが呼び出されると、メソッドに渡されたコールバック BeginAccept が呼び出されます。When the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドの呼び出しでは EndAcceptObjectDisposedException 操作が取り消されたことを示すためにがスローされます。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)

受信接続の試行を受け入れる非同期操作を開始し、クライアント アプリケーションによって送信されるデータの最初のブロックを受信します。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);
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

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

callback
AsyncCallback

AsyncCallback デリゲート。The AsyncCallback delegate.

state
Object

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

戻り値

IAsyncResult

非同期の 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.

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

ソケットへのアクセスを試行しているときにエラーが発生しました。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 BeginAccept state ます。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. パラメーターを使用して、このクラスのインスタンスをメソッドに渡し BeginAccept state ます。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.

EndAcceptSocketリモートホストとの間でデータを送受信するために使用できる新しいを返します。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. Close非同期操作の実行中にメソッドが呼び出されると、メソッドに渡されたコールバック BeginAccept が呼び出されます。When the Close method is called while an asynchronous operation is in progress, the callback provided to the BeginAccept method is called. 後続のメソッドの呼び出しでは EndAcceptObjectDisposedException 操作が取り消されたことを示すためにがスローされます。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.

こちらもご覧ください

適用対象