Compartilhar via


Função de retorno de chamada LPWSPSELECT (ws2spi.h)

A função LPWSPSelect determina o status de um ou mais soquetes.

Sintaxe

LPWSPSELECT Lpwspselect;

int Lpwspselect(
  [in]      int nfds,
  [in, out] fd_set *readfds,
  [in, out] fd_set *writefds,
  [in, out] fd_set *exceptfds,
  [in]      const timeval *timeout,
  [out]     LPINT lpErrno
)
{...}

Parâmetros

[in] nfds

Ignorado e incluído apenas para fins de compatibilidade.

[in, out] readfds

Ponteiro opcional para um conjunto de soquetes a ser verificado quanto à legibilidade.

[in, out] writefds

Ponteiro opcional para um conjunto de soquetes a ser verificado quanto à gravabilidade.

[in, out] exceptfds

Ponteiro opcional para um conjunto de soquetes a serem verificados quanto a erros.

[in] timeout

Tempo máximo para LPWSPSelect aguardar ou nulo para uma operação de bloqueio, na forma de uma estrutura de de valor de tempo .

[out] lpErrno

Ponteiro para o código de erro.

Valor de retorno

A função LPWSPSelect retorna o número total de descritores prontos e contidos nas estruturas de fd_set ou SOCKET_ERROR se ocorreu um erro. Se o valor retornado for SOCKET_ERROR, um código de erro específico estará disponível em lpErrno.

Código de erro Significado
WSAEFAULT
O provedor de serviços do Windows Sockets não pôde alocar os recursos necessários para suas operações internas ou osde readfds, writefds, exceptfds ou parâmetros de de valor de tempo não fazem parte do espaço de endereço do usuário.
WSAENETDOWN
O subsistema de rede falhou.
WSAEINVAL
O valor tempo limite não é válido ou todos os três parâmetros de descritor foram NULL.
WSAEINTR
A chamada (bloqueio) foi cancelada por meio de LPWSPCancelBlockingCall .
WSAEINPROGRESS
O bloqueio da chamada do Windows Sockets está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAENOTSOCK
Um dos conjuntos de descritores contém uma entrada que não é um soquete.

Observações

Essa função é usada para determinar o status de um ou mais soquetes. Para cada soquete, o chamador pode solicitar informações sobre o status de leitura, gravação ou erro. O conjunto de soquetes para o qual um determinado status é solicitado é indicado por uma estrutura de fd_set. Todas as entradas em um fd_set correspondem aos soquetes criados pelo provedor de serviços (ou seja, as estruturas de WSAPROTOCOL_INFO que descrevem seus protocolos têm o mesmo valor providerId). Após o retorno, as estruturas são atualizadas para refletir o subconjunto desses soquetes que atendem à condição especificada e LPWSPSelect retorna o número total de soquetes que atendem às condições. Um conjunto de macros é fornecido para manipular um fd_set. Essas macros são compatíveis com as usadas no software berkeley, mas a representação subjacente é completamente diferente.

O parâmetro readfds identifica os soquetes que devem ser verificados quanto à legibilidade. Se o soquete estiver escutando LPWSPListen, ele será marcado como legível se uma solicitação de conexão de entrada tiver sido recebida, de modo que uma LPWSPAccept seja garantida para ser concluída sem bloqueio. Para outros soquetes, a legibilidade significa que os dados enfileirados estão disponíveis para leitura para que um LPWSPRecv ou LPWSPRecvFrom não seja bloqueado.

Para soquetes orientados à conexão, a legibilidade também pode indicar que uma solicitação próxima foi recebida do par. Se o circuito virtual tiver sido fechado normalmente, um LPWSPRecv retornará imediatamente com zero bytes lidos. Se o circuito virtual foi redefinido, um LPWSPRecv será concluído imediatamente com um código de erro, como WSAECONNRESET. A presença de dados OOB será verificada se a opção de soquete SO_OOBINLINE tiver sido habilitada (consulte LPWSPSetSockOpt).

O parâmetro writefds identifica os soquetes que devem ser verificados quanto à gravabilidade:

  • Se um soquete estiver se conectando por meio de LPWSPConnect, a gravabilidade significa que o estabelecimento de conexão foi concluído com êxito.
  • Se o soquete não estiver em processo de escuta por meio de LPWSPConnect, a gravabilidade significa que uma LPWSPSend ou LPWSPSendTo terá êxito.

No entanto, eles podem bloquear um soquete de bloqueio se o len exceder a quantidade de espaço de buffer do sistema de saída disponível. Não é especificado por quanto tempo essas garantias podem ser consideradas válidas, especialmente em um ambiente multithread.

O parâmetro exceptfds identifica os soquetes que devem ser verificados quanto à presença de dados OOB ou a quaisquer condições de erro excepcionais. Observe que os dados OOB só serão relatados dessa forma se a opção SO_OOBINLINE for false. Se um soquete estiver fazendo uma conexão LPWSPConnect (não desbloqueio), a falha da tentativa de conexão será indicada em exceções. Essa especificação não define quais outros erros serão incluídos.

Qualquer um dos dois , writefdsou pode ser dado como nulo se nenhum descritor deve ser verificado quanto à condição de interesse. Pelo menos um deve ser nãonulo e qualquer conjunto de descritor de nulo nãodeve conter pelo menos um descritor de soquete.

Resumo: um soquete será identificado em um determinado conjunto quando LPWSPSelect retornar de acordo com o seguinte.

Parâmetro Descrição
readfds: Se LPWSPListen for chamado, uma conexão estará pendente, LPWSPAccept terá êxito. Os dados estarão disponíveis para leitura (inclui dados OOB se SO_OOBINLINE estiver habilitado). A conexão foi fechada/redefinida/encerrada.
writefds: Se LPWSPConnect (sem bloqueio), a conexão foi bem-sucedida. Os dados podem ser enviados.
exceptfds: Se LPWSPConnect (não desbloqueio), a tentativa de conexão falhou. Os dados do OOB estão disponíveis para leitura (somente se SO_OOBINLINE estiver desabilitado).

 

 

Três macros e uma função de upcall são definidas no arquivo de cabeçalho Ws2spi.h para manipular e verificar os conjuntos de descritores. A variável FD_SETSIZE determina o número máximo de descritores em um conjunto. (O valor padrão de FD_SETSIZE é 64, que pode ser modificado por #defining FD_SETSIZE para outro valor antes de #including Ws2spi.h.) Internamente, os identificadores de soquete em uma fd_set não são representados como sinalizadores de bits como em Berkeley UNIX. A representação de dados deles é opaca. O uso dessas macros manterá a portabilidade do software entre diferentes ambientes de soquete.

As macros para manipular e verificar fd_set conteúdo são:

FD_CLR(de, *set)

Remove o do do descritor do conjunto de .

FD_SET(de, *set)

Adiciona de de descritor ao conjunto .

FD_ZERO(*)

Inicializa o conjunto de para o conjunto de nulo .

A função upcall usada para verificar a associação é:

intWPUFDIsSet (do SOCKET, FD_SETdeFAR );

que retornará diferente de zero se for um membro do conjunto de ou de outra forma zero.

O parâmetro tempo limite controla por quanto tempo o LPWSPSelect pode levar para ser concluído. Se tempo limite for um ponteiro de nulo , LPWSPSelect será bloqueado indefinidamente até que pelo menos um descritor atenda aos critérios especificados. Caso contrário, tempo limite aponta para uma estrutura de valor de tempo que especifica o tempo máximo que LPWSPSelect deve aguardar antes de retornar. Quando LPWSPSelect retorna, o conteúdo da estrutura de valor de tempo não é alterado. Se de valor de tempo for inicializado como {0, 0}, LPWSPSelect retornará imediatamente; isso é usado para sondar o estado dos soquetes selecionados. Se esse for o caso, a chamada LPWSPSelect será considerada não desbloqueado e as suposições padrão para chamadas sem bloqueio se aplicam. Por exemplo, o gancho de bloqueio não será chamado e o provedor de Soquetes do Windows não produzirá.

Nota

A função LPWSPSelect não tem efeito sobre a persistência de eventos de soquete registrados com LPWSPAsyncSelect ou LPWSPEventSelect.

Requisitos

Requisito Valor
de cliente com suporte mínimo Windows 2000 Professional [somente aplicativos da área de trabalho]
servidor com suporte mínimo Windows 2000 Server [somente aplicativos da área de trabalho]
cabeçalho ws2spi.h

Consulte também

LPWSPAccept

LPWSPConnect

LPWSPEventSelect

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo