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

Объект IAsyncResult, который ссылается на асинхронное создание объекта Socket.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. Необходимо вызвать Bind(EndPoint) и Listen(Int32) до вызова объекта BeginAccept(AsyncCallback, Object).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 параметр — null , что заставляет BeginAccept метод создать обслуживаемый сокет.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.

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. Вызовите метод Set для в ManualResetEvent методе обратного вызова, если необходимо, чтобы исходный поток продолжал выполнение.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. При последующем вызове 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. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.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

Объект IAsyncResult, который ссылается на асинхронное создание объекта Socket.An 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. Необходимо вызвать Bind(EndPoint) и Listen(Int32) до вызова объекта BeginAccept(AsyncCallback, Object).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. Вызовите метод Set для в ManualResetEvent методе обратного вызова, если необходимо, чтобы исходный поток продолжал выполнение.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. При последующем вызове 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. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.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

Объект IAsyncResult, который ссылается на асинхронное создание объекта Socket.An 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. Необходимо вызвать Bind(EndPoint) и Listen(Int32) до вызова объекта BeginAccept(AsyncCallback, Object).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.

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. Вызовите метод Set для в ManualResetEvent методе обратного вызова, если необходимо, чтобы исходный поток продолжал выполнение.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. При последующем вызове 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. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.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.

См. также раздел

Применяется к