Socket.AcceptAsync(SocketAsyncEventArgs) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Inicia uma operação assíncrona para aceitar uma tentativa de conexão de entrada.
public:
bool AcceptAsync(System::Net::Sockets::SocketAsyncEventArgs ^ e);
public bool AcceptAsync(System.Net.Sockets.SocketAsyncEventArgs e);
member this.AcceptAsync : System.Net.Sockets.SocketAsyncEventArgs -> bool
Public Function AcceptAsync (e As SocketAsyncEventArgs) As Boolean
Parâmetros
O SocketAsyncEventArgs objeto a ser usado para esta operação de soquete assíncrona.
Retornos
true se a operação de E/S estiver pendente. O Completed evento no e parâmetro será gerado após a conclusão da operação.
false se a operação de E/S for concluída de forma síncrona. O Completed evento no e parâmetro não será gerado e o e objeto passado como um parâmetro poderá ser examinado imediatamente após a chamada do método retornar para recuperar o resultado da operação.
Exceções
Um argumento não é válido. Essa exceção ocorrerá se o buffer fornecido não for grande o suficiente. O buffer deve ter pelo menos 2 * (sizeof(SOCKADDR_STORAGE + 16)) bytes.
Essa exceção também ocorre se vários buffers forem especificados, a BufferList propriedade não será nula.
Um argumento está fora do intervalo. A exceção ocorrerá se for Count menor que 0.
Uma operação inválida foi solicitada. Essa exceção ocorrerá se a aceitação não estiver escutando Socket conexões ou se o soquete aceito estiver associado.
Você deve chamar o Bind(EndPoint) método e Listen(Int32) antes de chamar o AcceptAsync(SocketAsyncEventArgs) método.
Essa exceção também ocorre se o soquete já estiver conectado ou se uma operação de soquete já estiver em andamento usando o parâmetro especificado e .
Erro ao tentar acessar o soquete.
O Socket foi fechado.
Comentários
Os protocolos orientados à conexão podem usar o AcceptAsync método para processar as tentativas de conexão de entrada de forma assíncrona. Aceitar conexões de forma assíncrona oferece a capacidade de enviar e receber dados em um thread de execução separado. Antes de chamar o AcceptAsync método, você deve chamar o Listen método para escutar e enfileirar solicitações de conexão de entrada.
Para ser notificado sobre a conclusão, você deve criar um método de retorno de chamada que implemente o delegado EventHandler<SocketAsyncEventArgs> e conecte-o ao SocketAsyncEventArgs.Completed evento.
As seguintes propriedades e eventos no System.Net.Sockets.SocketAsyncEventArgs objeto são necessários:
Opcionalmente, o chamador pode especificar um existente Socket a ser usado para a conexão de entrada especificando o Socket uso com a SocketAsyncEventArgs.AcceptSocket propriedade.
Se a SocketAsyncEventArgs.AcceptSocket propriedade for nula, um novo Socket será construído com o mesmo AddressFamily, SocketTypee ProtocolType como o atual Socket e definido como a SocketAsyncEventArgs.AcceptSocket propriedade.
O chamador pode definir a SocketAsyncEventArgs.UserToken propriedade para qualquer objeto de estado de usuário desejado antes de chamar o AcceptAsync método, para que as informações sejam recuperáveis no método de retorno de chamada. Se o retorno de chamada precisar de mais informações do que um único objeto, uma classe pequena poderá ser criada para manter as outras informações de estado necessárias como membros.
Opcionalmente, um buffer pode ser fornecido para receber o bloco inicial de dados no soquete depois que o ConnectAsync método for bem-sucedido. Nesse caso, a SocketAsyncEventArgs.Buffer propriedade precisa ser definida como o buffer que contém os dados a serem recebidos e a SocketAsyncEventArgs.Count propriedade precisa ser definida como o número máximo de bytes de dados a serem recebidos no buffer. Essas propriedades podem ser definidas usando o SocketAsyncEventArgs.SetBuffer método. Parte do buffer passado será consumida internamente para uso pela chamada Winsock AcceptEx subjacente. Isso significa que a quantidade de dados retornados sempre será menor do que o valor da SocketAsyncEventArgs.Count propriedade na System.Net.Sockets.SocketAsyncEventArgs instância fornecida. A quantidade do buffer usado internamente varia de acordo com a família de endereços do soquete. O tamanho mínimo do buffer necessário é de 288 bytes. Se um tamanho de buffer maior for especificado, os Socket dados adicionais serão esperados além dos dados de endereço recebidos pela chamada Winsock AcceptEx e aguardarão até que esses dados extras sejam recebidos. Se ocorrer um tempo limite, a conexão será redefinida. Portanto, se forem esperados dados extras de uma quantidade específica, o tamanho do buffer deverá ser definido como o tamanho mínimo do buffer mais essa quantidade.
O método de retorno de chamada de conclusão deve examinar a SocketAsyncEventArgs.SocketError propriedade para determinar se a AcceptAsync operação foi bem-sucedida.
O SocketAsyncEventArgs.Completed evento pode ocorrer em alguns casos quando nenhuma conexão foi aceita e fazer com que a SocketAsyncEventArgs.SocketError propriedade seja definida ConnectionResetcomo . Isso pode ocorrer como resultado da verificação de porta usando uma verificação de tipo SYN semiaberto (uma sequência SYN -> SYN-ACK -> RST). Os aplicativos que usam o AcceptAsync método devem estar preparados para lidar com essa condição.