WSAEventSelect

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

Essa função especifica um objeto evento ser associado com o conjunto fornecido de FD_XXX Eventos rede.

Syntax

int WSAEventSelect(
  SOCKET s,
  WSAEVENT hEventObject,
  long lNetworkEvents
);

Parameters

  • s
    [no] Descritor identificando a Soquete.
  • hEventObject
    [no] Manipular identificando o objeto evento ser associado com o conjunto fornecido de FD_XXX Eventos rede.
  • lNetworkEvents
    [no] Máscara de bits que especifica a combinação de FD_XXX Eventos rede no qual o aplicativo tem interesse.

Return Value

O valor de retorno será zero se Especificação do aplicativo de eventos de rede e o associado objeto evento foi bem-sucedido. Se ocorre um erro, o valor retornado SOCKET_ERROR e um número de erro específicas pode ser recuperado por chamado de WSAGetLastError função.

As in a maiúsculas e minúsculas das Selecione função, WSAEventSelect Será freqüentes ser usada para determinar quando uma operação transferência de dados (enviar ou receber) podem ser emitidos com a expectativa de sucesso imediata. Contudo, um aplicativo robusto deve estar preparado para a possibilidade de que o objeto evento está definido e emite um chamar Soquetes do Windows que WSAEWOULDBLOCK retorna imediatamente. De exemplo, a seguinte seqüência de operações é possível:

  1. Dados chega em Soquete s; Conjuntos Soquetes do Windows o WSAEventSelect objeto evento.
  2. O aplicativo faz algum outro processamento.
  3. Durante processamento, as questões aplicativo um ioctlsocket e avisos que não há dados prontos ser ler.
  4. Os problemas aplicativo um Recv Para ler os dados.
  5. O aplicativo aguarda no objeto de evento especificado em WSAEventSelect, que retorna imediatamente indicando que dados está pronto para ler.
  6. Problemas de aplicativo Recv que falha com o erro WSAEWOULDBLOCK.

A ocorrência do evento de rede é registrada, o correspondente bit é definido no registro de evento rede interna e o associado objeto evento é signalled. Nenhuma ação adicional é obtida para o evento rede até que o aplicativo faz a chamada de função ou implicitamente reativa a configuração do evento e sinais de associado objeto evento.

Evento de rede Habilitar novamente função

FD_READ

Recv, recvfrom, WSARecv, ou WSARecvFrom.

FD_WRITE

Enviar, SendTo, WSASend, ou WSASendTo.

FD_OOB

Recv, recvfrom, WSARecv, ou WSARecvFrom.

FD_ACCEPT

aceitar (Soquetes do Windows) Ou WSAAccept a menos que o código de erro retornado WSATRY_AGAIN indicando que a função condição retornado CF_DEFER.

FD_CONNECT

Nenhum.

FD_CLOSE

Nenhum.

INTERFACE_CHANGE FD_ROUTING_

WSAIoctl Com o comando SIO_ROUTING_INTERFACE_CHANGE.

LIST_CHANGE FD_ADDRESS_

WSAIoctl Com o comando SIO_ADDRESS_LIST_CHANGE.

Qualquer chamar para a rotina re-Enabling, mesmo um que falhar, resulta em habilitar novamente de gravação e a sinalização para o evento rede relevantes e objeto evento.

Para FD_READ, FD_OOB, FD_ACCEPT rede eventos, gravação evento rede e a Sinalização objeto evento são nível-disparado. Isso significa que se a rotina re-Enabling for chamado e a condição rede relevante é ainda válido depois de chamar, o evento rede é registrado e o associado objeto evento está definido. Isso permite que um aplicativo sejam Event-driven e não se preocupe com a quantidade de dados que chegam em qualquer um tempo. Considere a seguinte seqüência:

  1. Um provedor transporte recebe 100 bytes de dados em Soquete s Faz com que ws2.dll para registro de evento rede FD_READ e definir o associado objeto evento.
  2. Problemas de aplicativo Recv(s, buffptr, 50, 0) para ler 50 bytes.
  3. O provedor transporte faz com que ws2.dll para registro de evento rede FD_READ e define o associado objeto evento novamente porque ainda há dados serem ler.

Com essas semântica, um aplicativo não precisa ler disponível todos os dados em resposta a um evento rede FD_READ — um único Recv Em resposta a cada rede FD_READ evento é apropriado.

Os eventos FD_ROUTING_INTERFACE_CHANGE e FD_ADDRESS_LIST_CHANGE são considerados borda-disparada assim. Uma mensagem será postada exatamente uma vez quando uma alteração ocorre após o aplicativo solicitou a notificação pela emissão WSAIoctl Com SIO_ROUTING_INTERFACE_CHANGE ou SIO_ADDRESS_LIST_CHANGE correspondentemente. Outras mensagens não estarão próxima até que o aplicativo re-Issues o IOCTL e outra alteração é detectada desde o IOCTL foi emitido.

Se um evento rede já aconteceu quando o aplicativo chama WSAEventSelect ou quando a função re-Enabling é chamado, um evento rede é registrado e o associado evento objeto é definido como apropriado. De exemplo, considere a seguinte seqüência:

  1. Um aplicativo chama escutar.
  2. Um connectrequest é recebida, mas ainda não foram aceitas.
  3. Chamadas do aplicativo WSAEventSelect especificando que ela está interessada no evento FD_ACCEPT rede para o Soquete. Devido à persistência dos eventos rede, Soquetes do Windows registra o evento FD_ACCEPT rede e define o associado evento objeto imediatamente.

O evento rede FD_WRITE é tratado de maneira ligeiramente diferente. Um evento rede FD_WRITE é gravado quando um Soquete primeiro está conectado com conectar/WSAConnect ou aceitos com aceitar/WSAAccepte em seguida, após um envio falha com WSAEWOULDBLOCK e espaço do buffer se torna disponível. Portanto, um aplicativo pode assumir que envia é possível iniciando a partir de configuração primeira evento rede FD_WRITE e duradouro até um envio retorna WSAEWOULDBLOCK. Após uma falha tal, o aplicativo será localizar sem que envia são possível novamente quando um evento rede FD_WRITE é registrado e o associado objeto evento está definido.

O evento rede FD_OOB é usado somente quando um Soquete é configurado para receber out of banda (OOB) dados separadamente. Se o Soquete estiver configurado para receber dados OOB interno, os dados OOB (expedited) são tratados como dados normal e o aplicativo deve registrar um interesse e irá get um evento rede FD_READ, não um evento rede FD_OOB. Um aplicativo pode definir ou inspecionar a maneira na qual OOB dados para serem manipulados usando setsockopt (Soquetes do Windows) Ou getsockopt (Soquetes do Windows) Para a opção SO_OOBINLINE.

O código de erro em um evento rede FD_CLOSE indica se o Soquete fechar era normal ou abortive. Se o código de erro for zero, então a fechar foi normal; Se o código de erro é WSAECONNRESET, circuito virtual do Soquete foi redefinir. Isso só se aplica aos soquetes orientado à conexão, como SOCK_STREAM.

O evento rede FD_CLOSE é gravado quando um fechar indicação é recebida para o correspondente circuito virtual para o Soquete. Em termos TCP, isso significa que o FD_CLOSE é gravada quando a conexão entra nos estados wait time ou WAIT Close. Isso resulta do remoto end executando um desligamento No lado de envio ou um closesocket. O evento rede FD_CLOSE está lançado após todos os dados ler de uma Soquete. Um aplicativo deve verificar para dados restantes no recebimento de FD_CLOSE para evitar qualquer possibilidade de perder dados.

Soquetes do Windows será registro apenas um evento rede FD_CLOSE para indicar encerramento de um circuito virtual. Ele não será registro um evento rede FD_READ para indicar essa condição.

O evento rede FD_ROUTING_INTERFACE_CHANGE é registrado quando o local que deve ser usado para alcançar o destino especificado na interface WSAIoctl Com alterações SIO_ROUTING_INTERFACE_CHANGE depois tal IOCTL foi emitidas.

O evento rede FD_ADDRESS_LIST_CHANGE é registrado quando a lista de endereços da família de protocolo para o Soquete para que o aplicativo pode alterações BIND depois WSAIoctl Com SIO_ADDRESS_LIST_CHANGE foi emitido.

A seguinte tabela mostra uma lista dos códigos de erro possível.

Código de erro Descrição

WSANOTINITIALISED

Um bem-sucedido WSAStartup chamar deve ocorrer antes de usar essa função.

WSAENETDOWN

Falha no subsistema da rede.

WSAEINVAL

Um dos parâmetros especificados era inválido ou especificado Soquete está em um inválido estado.

WSAEINPROGRESS

Um bloqueio é chamar sockets do Windows (Winsock) em andamento, ou o serviço provedor ainda é processamento um função callback.

WSAENOTSOCK

O descritor não é um Soquete.

Remarks

Essa função é usada para especificar um objeto evento, hEventObjeto, a ser associado com o FD_ selecionadoXXX Eventos rede, lNetworkEvents. O Soquete para a qual um objeto evento é especificado é identificado pelo parâmetro s. O objeto evento é definido quando qualquer uma das ocorrer eventos de rede indicado.

Essa função define o associado objeto evento e registra a ocorrência desse evento em um registro evento rede interna. Um aplicativo pode usar WSAEnumNetworkEvents Para recuperar o conteúdo do registro de evento rede interna e assim determinar quais a rede indicado eventos ocorreram.

WSAEventSelect é a única função que faz com que rede atividade e erros ser gravada e recuperável através WSAEnumNetworkEvents. Consulte a descrição de Selecione Para localizar fora como essa função relata erros e rede atividade.

O WSAEventSelect função automaticamente conjuntos Soquete s Para de não bloqueio modo, regardless of o valor de lNetworkEvents. Consulte ioctlsocket e WSAIoctl Para obter informações sobre como definir a Soquete voltar para bloqueio modo.

O lNetworkEvents parâmetro é construído usando o operador bit a bit OR com qualquer um dos valores especificados na seguinte tabela.

Valor Descrição

FD_READ

Deseja receber notificação de preparação para leitura.

FD_WRITE

Deseja receber notificação de preparação para gravação.

FD_OOB

Deseja receber notificação da chegada de Out Of dados banda (OOB).

FD_ACCEPT

Deseja receber notificação de de entrada Conexões.

FD_CONNECT

Deseja receber notificação de uma conexão concluída ou operação junção multiponto.

FD_CLOSE

Deseja receber notificação de um feriado Soquete.

INTERFACE_CHANGE FD_ROUTING_

Deseja receber notificação de roteamento alterações interface para o destino especificado.

LIST_CHANGE FD_ADDRESS_

Deseja receber notificação de local endereço lista altera para o família de endereços da Soquete.

Emitir um WSAEventSelect chamar para um Soquete cancela qualquer anterior WSAEventSelect Chama a mesma Soquete e limpa o registro evento rede interna. De exemplo, para associar um objeto evento com lendo e gravando eventos rede, o aplicativo deve chamar WSAEventSelect Com o FD_READ e FD_WRITE como a seguinte mostra amostra de código.

rc = WSAEventSelect(s, hEventObject, FD_READ|FD_WRITE);

Não é possível especificar evento diferentes objetos de rede diferentes eventos. O seguinte codificar não irá trabalho porque a chamar segunda será cancelar os efeitos da primeira e somente o evento rede FD_WRITE será associado com hEventObject2.

rc = WSAEventSelect(s, hEventObject1, FD_READ);
rc = WSAEventSelect(s, hEventObject2, FD_WRITE); //bad

Para cancelar a associação e seleção de rede eventos em um Soquete, lNetworkEvents Deve ser definido para zero, no qual maiúsculas e minúsculas o hEventObject parâmetro será ignorado.

rc = WSAEventSelect(s, hEventObject, 0);

Fechar um Soquete com o closesocket função também cancela a associação e seleção de eventos especificados na rede WSAEventSelect Para o Soquete. O aplicativo, no entanto, ainda deve chamar WSACloseEvent Para explicitamente fechar o objeto evento e livre quaisquer recursos.

O Soquete criado quando o aceitar função é chamado tem as mesmas propriedades como a Soquete de escuta usado para aceitá-lo. Qualquer WSAEventSelect associação e rede seleção eventos definidos para a escuta aplicar Soquete para o Soquete aceito. De exemplo, se tiver um Soquete de escuta um WSAEventSelect associação de hEventOject Com FD_ACCEPT, FD_READ e FD_WRITE, em seguida, qualquer Soquete aceito em que Soquete escuta também terá eventos rede FD_ACCEPT, FD_READ e FD_WRITE associado com o mesmo hEventObject. Se um diferente hEventObject ou evento rede for desejado, o aplicativo deve chamar WSAEventSelect, passando o Soquete aceita e as informações novas desejadas.

Requirements

Header winsock2.h
Library Ws2.lib
Windows Embedded CE Windows CE .NET 4.0 and later
Windows Mobile Windows Mobile Version 5.0 and later

See Also

Reference

accept (Windows Sockets)
closesocket
getsockopt (Windows Sockets)
ioctlsocket
listen
recv
recvfrom
select
send
sendto
setsockopt (Windows Sockets)
shutdown
WSAAccept
WSACloseEvent
WSACreateEvent
WSAEnumNetworkEvents
WSAGetLastError
WSAIoctl
WSARecv
WSARecvFrom
WSASend
WSASendTo
WSAStartup