Socket.BeginAccept メソッド

受信接続の試行を受け入れる非同期操作を開始します。

Public Function BeginAccept( _
   ByVal callback As AsyncCallback, _   ByVal state As Object _) As IAsyncResult
[C#]
public IAsyncResult BeginAccept(AsyncCallbackcallback,objectstate);
[C++]
public: IAsyncResult* BeginAccept(AsyncCallback* callback,Object* state);
[JScript]
public function BeginAccept(
   callback : AsyncCallback,state : Object) : IAsyncResult;

パラメータ

  • callback
    AsyncCallback デリゲート。
  • state
    要求の状態情報を格納するオブジェクト。

戻り値

非同期の Socket 作成を参照する IAsyncResult

例外

例外の種類 条件
SocketException ソケットへのアクセスを試みているときにエラーが発生しました。詳細については「解説」を参照してください。
ObjectDisposedException Socket は閉じられています。

解説

コネクション指向のプロトコルは、 BeginAccept メソッドを使用して受信接続の試行を非同期的に処理できます。接続を非同期的に受け入れると、個別の実行スレッド内でデータを送受信できます。 BeginAccept メソッドを呼び出す前に、 Listen メソッドを呼び出して、受信接続要求を待機してキューに置いておく必要があります。

AsyncCallback デリゲートを実装するコールバック メソッドを作成し、その名前を BeginAccept メソッドに渡す必要があります。この操作を行うには、少なくとも、 state パラメータを使用して、待機中の SocketBeginAccept に渡さなければなりません。他の情報がコールバックに必要な場合は、小さなクラスを作成して Socket などの必要な情報を保持します。このクラスのインスタンスは、 state パラメータを使用して BeginAccept メソッドに渡します。

コールバック メソッドは EndAccept メソッドを実装する必要があります。アプリケーションが BeginAccept を呼び出すと、指定したコールバック メソッドが個別のスレッドを使用して実行され、 EndAccept は、保留中の接続が取得されるまでブロックします。 EndAccept は、リモート ホストとのデータの送受信に使用できる、新しい Socket を返します。この返された Socket を使用して、他の接続を接続キューから受け取ることはできません。 BeginAccept メソッドを呼び出してから元のスレッドをブロックする場合は、 WaitHandle.WaitOne を使用します。元のスレッドの実行を継続させるには、コールバック メソッドで ManualResetEvent.Set を呼び出します。コールバック メソッドの記述に関する追加情報については、「 Callback のサンプル 」を参照してください。

メモ   返された SocketRemoteEndPoint メソッドを呼び出すと、リモート ホストのネットワーク アドレスとポート番号を確認できます。

メモ    SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。

使用例

[Visual Basic, C#, C++] 受信接続を非同期的に受信する試みを次の例に示します。

 
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

[C#] 
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());
   }

[C++] 
IPHostEntry* lipa = Dns::Resolve(S"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(S"Waiting for a connection...");
        AsyncCallback* pasync = new AsyncCallback(0, &Async_Send_Receive::Listen_Callback);
        s->BeginAccept(pasync, s);

        allDone->WaitOne();
    }
} catch (Exception* e) {
    Console::WriteLine(e);
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard

参照

Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | 非同期呼び出しの組み込み | Listen | AsyncCallback | EndAccept | Socket | RemoteEndPoint