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 Socket a serem verificadas quanto à legibilidade.

checkWrite
IList

Um IList de instâncias Socket a serem verificadas quanto à capacidade de gravação.

checkError
IList

Um IList de instâncias Socket a serem verificadas quanto a erros.

timeout
TimeSpan

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

Exceções

O checkReadparâmetro , checkWriteou checkError é null ou vazio.

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

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

Ocorreu um 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 Socket a serem verificadas quanto à legibilidade.

checkWrite
IList

Um IList de instâncias Socket a serem verificadas quanto à capacidade de gravação.

checkError
IList

Um IList de instâncias Socket a serem verificadas quanto a erros.

microSeconds
Int32

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

Exceções

O parâmetro checkRead é null ou está vazio.

-e-

O parâmetro checkWrite é null ou está vazio

-e-

O parâmetro checkError é null ou está vazio.

Ocorreu um erro ao tentar acessar o soquete.

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

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

Exemplos

O exemplo de código a seguir usa para determinar quais soquetes Select 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 Socket instâncias. Você deve colocar um ou mais soquetes em um IList antes de poder usar o Select método . Verifique a legibilidade chamando Select com o IList como o checkRead parâmetro . Para marcar seus soquetes quanto à capacidade de gravação, use o checkWrite parâmetro . 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 bloqueio. 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 remoto Socket 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 checkReadlistas , checkWritee checkError ) atende aos critérios especificados ou o microSeconds parâmetro é excedido, o que ocorrer primeiro. Definir microSeconds como -1 especifica um tempo limite infinito.

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

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

Observação

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

Observação

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.

Observação

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

Confira também

Aplica-se a