Compartilhar via


Socket.Select Método

Definição

Sobrecargas

Select(IList, IList, IList, TimeSpan)

Determina o status de um ou mais soquetes.

Select(IList, IList, IList, Int32)

Determina o status de um ou mais soquetes.

Select(IList, IList, IList, TimeSpan)

Origem:
Socket.cs
Origem:
Socket.cs
Origem:
Socket.cs

Determina o status de um ou mais soquetes.

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, TimeSpan timeout);
public static void Select (System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, TimeSpan timeout);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * TimeSpan -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, timeout As TimeSpan)

Parâmetros

checkRead
IList

Um IList de instâncias de Socket para verificar a legibilidade.

checkWrite
IList

Um IList de instâncias de Socket para verificar a capacidade de gravação.

checkError
IList

Um IList de instâncias de Socket para verificar se há erros.

timeout
TimeSpan

O valor do tempo limite. Um valor igual a -1 microssegundos indica um tempo limite infinito.

Exceções

Os parâmetros checkRead, checkWritee checkError estão todos null ou vazios. Pelo menos um dos checkRead, checkWriteou checkError deve conter pelo menos um Socket.

O parâmetro checkRead, checkWriteou checkError contém muitos soquetes.

O timeout era menor que -1 microssegundos ou maior que MaxValue microssegundos

Erro ao tentar acessar o soquete.

Um ou mais soquetes foram descartados.

Aplica-se a

Select(IList, IList, IList, Int32)

Origem:
Socket.cs
Origem:
Socket.cs
Origem:
Socket.cs

Determina o status de um ou mais soquetes.

public:
 static void Select(System::Collections::IList ^ checkRead, System::Collections::IList ^ checkWrite, System::Collections::IList ^ checkError, int microSeconds);
public static void Select (System.Collections.IList? checkRead, System.Collections.IList? checkWrite, System.Collections.IList? checkError, int microSeconds);
public static void Select (System.Collections.IList checkRead, System.Collections.IList checkWrite, System.Collections.IList checkError, int microSeconds);
static member Select : System.Collections.IList * System.Collections.IList * System.Collections.IList * int -> unit
Public Shared Sub Select (checkRead As IList, checkWrite As IList, checkError As IList, microSeconds As Integer)

Parâmetros

checkRead
IList

Um IList de instâncias de Socket para verificar a legibilidade.

checkWrite
IList

Um IList de instâncias de Socket para verificar a capacidade de gravação.

checkError
IList

Um IList de instâncias de Socket para verificar se há erros.

microSeconds
Int32

O valor de tempo limite, em microssegundos. Um valor -1 indica um tempo limite infinito.

Exceções

Os parâmetros checkRead, checkWritee checkError estão todos null ou vazios. Pelo menos um dos checkRead, checkWriteou checkError deve conter pelo menos um Socket.

Erro ao tentar acessar o soquete.

.NET 5 e posterior: um ou mais soquetes são descartados.

O parâmetro checkRead, checkWriteou checkError contém muitos soquetes.

Exemplos

O exemplo de código a seguir usa Select para determinar quais soquetes de escuta têm uma solicitação de conexão.

      IPHostEntry^ lipa = Dns::Resolve( Dns::GetHostName() );
      
      //Gets three separate local endpoints.
      IPEndPoint^ lep1 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11000 );
      IPEndPoint^ lep2 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11001 );
      IPEndPoint^ lep3 = gcnew IPEndPoint( lipa->AddressList[ 0 ],11002 );
      
      //creates an array of endpoints.
      array<IPEndPoint^>^ipendpoints = gcnew array<IPEndPoint^>(3);
      ipendpoints[ 0 ] = lep1;
      ipendpoints[ 1 ] = lep2;
      ipendpoints[ 2 ] = lep3;
      
      //Creates three separate sockets.
      Socket^ s1 = gcnew Socket( lep1->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      Socket^ s2 = gcnew Socket( lep2->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      Socket^ s3 = gcnew Socket( lep3->Address->AddressFamily,SocketType::Stream,ProtocolType::Tcp );
      array<Socket^>^socketList = gcnew array<Socket^>(3);
      socketList[ 0 ] = s1;
      socketList[ 1 ] = s2;
      socketList[ 2 ] = s3;
      
      //Binds and Listens on all sockets in the array of sockets.
      for ( int i = 0; i < 3; i++ )
      {
         socketList[ i ]->Bind( ipendpoints[ i ] );
         socketList[ i ]->Listen( 1000 );

      }
      
      //Calls Select to determine which sockets are ready for reading.
      Socket::Select( safe_cast<IList^>(socketList), nullptr, nullptr, 1000 );
      
      //Reads on the sockets returned by Select.
      array<Byte>^buffer = gcnew array<Byte>(1024);
      String^ outString;
      for ( Int32 j = 0; j < (socketList->Length - 1); j++ )
      {
         socketList[ j ]->Receive( buffer );
         outString =  "Socket ";
         outString->Concat( j.ToString(),  " has the message", Encoding::ASCII->GetString( buffer ) );
         Console::WriteLine( outString );

      }
   }

};

int main()
{
   return 0;
}
IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];

Socket socket0 = null;
Socket socket1 = null;
Socket socket2 = null;
Socket socket3 = null;
Socket socket4 = null;
Socket socket5 = null;

ArrayList listenList = new ArrayList();
listenList.Add(socket0);
listenList.Add(socket1);
listenList.Add(socket2);

ArrayList acceptList = new ArrayList();
acceptList.Add(socket3);
acceptList.Add(socket4);
acceptList.Add(socket5);

for( int i = 0; i < 3; i++ )
{
  listenList[i] = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream,
                             ProtocolType.Tcp);
  ((Socket)listenList[i]).Bind(new IPEndPoint(ipAddress, 11000 + i));
  ((Socket)listenList[i]).Listen(10);
}

// Only the sockets that contain a connection request
// will remain in listenList after Select returns.

Socket.Select(listenList, null, null, 1000);

for( int i = 0; i < listenList.Count; i++ )
{
  acceptList[i] = ((Socket)listenList[i]).Accept();
}
Dim ipHostEntry As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress = ipHostEntry.AddressList(0)

Dim socket0 As Socket = Nothing
Dim socket1 As Socket = Nothing
Dim socket2 As Socket = Nothing
Dim socket3 As Socket = Nothing
Dim socket4 As Socket = Nothing
Dim socket5 As Socket = Nothing

Dim listenList As New ArrayList()
listenList.Add(socket0)
listenList.Add(socket1)
listenList.Add(socket2)

Dim acceptList As New ArrayList()
acceptList.Add(socket3)
acceptList.Add(socket4)
acceptList.Add(socket5)

Dim i As Integer
For i = 0 To 2
   listenList(i) = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
   CType(listenList(i), Socket).Bind(New IPEndPoint(ipAddress, 11000 + i))
   CType(listenList(i), Socket).Listen(10)
Next i

'Only the sockets that contain a connection request
'will remain in listenList after Select returns.
Socket.Select(listenList, Nothing, Nothing, 1000)

For i = 0 To listenList.Count - 1
   acceptList(i) = CType(listenList(i), Socket).Accept()
Next i

Comentários

Select é um método estático que determina o status de uma ou mais instâncias Socket. Você deve colocar um ou mais soquetes em um IList antes de poder usar o método Select. Verifique a legibilidade chamando Select com o IList como o parâmetro checkRead. Para verificar se os soquetes estão em busca de gravabilidade, use o parâmetro checkWrite. Para detectar condições de erro, use checkError. Depois de chamar Select, o IList será preenchido apenas com os soquetes que atendem às condições.

Se você estiver em um estado de escuta, a legibilidade significa que uma chamada para Accept terá êxito sem bloquear. Se você já aceitou a conexão, a legibilidade significa que os dados estão disponíveis para leitura. Nesses casos, todas as operações de recebimento terão êxito sem bloqueio. A legibilidade também pode indicar se o Socket remoto desligou a conexão; nesse caso, uma chamada para Receive retornará imediatamente, com zero bytes retornados.

Select retorna quando pelo menos um dos soquetes de interesse (os soquetes nas listas checkRead, checkWritee checkError) atende aos critérios especificados ou o parâmetro microSeconds é excedido, o que ocorrer primeiro. Definir microSeconds para -1 especifica um tempo limite infinito.

Se você fizer uma chamada sem bloqueio para Connect, a gravabilidade significa que você se conectou com êxito. Se você já tiver uma conexão estabelecida, a gravabilidade significa que todas as operações de envio terão êxito sem bloqueio.

Se você tiver feito uma chamada sem bloqueio para Connect, o parâmetro checkerror identificará soquetes que não se conectaram com êxito.

Nota

Use o método Poll se você quiser determinar apenas o status de um único Socket.

Nota

Esse método não pode detectar determinados tipos de problemas de conexão, como um cabo de rede quebrado, ou que o host remoto foi desligado sem êxito. Você deve tentar enviar ou receber dados para detectar esses tipos de erros.

Nota

Se você receber um SocketException, use a propriedade SocketException.ErrorCode para obter o código de erro específico. Depois de obter esse código, consulte o código de erro da API do Windows Sockets versão 2 documentação para obter uma descrição detalhada do erro.

Confira também

Aplica-se a