Socket.Select(IList, IList, IList, Int32) Método

Definição

Determina o status de um ou mais soquetes.Determines the status of one or more sockets.

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.An IList of Socket instances to check for readability.

checkWrite
IList

Um IList de instâncias Socket a serem verificadas quanto à capacidade de gravação.An IList of Socket instances to check for writability.

checkError
IList

Um IList de instâncias Socket a serem verificadas quanto a erros.An IList of Socket instances to check for errors.

microSeconds
Int32

O valor de tempo limite, em microssegundos.The time-out value, in microseconds. Um valor de -1 indica um tempo limite infinito.A -1 value indicates an infinite time-out.

Exceções

O parâmetro checkRead é null ou está vazio.The checkRead parameter is null or empty.

-e--and- O parâmetro checkWrite é null ou está vazioThe checkWrite parameter is null or empty -e--and- O parâmetro checkError é null ou está vazio.The checkError parameter is null or empty.

Ocorreu um erro ao tentar acessar o soquete.An error occurred when attempting to access the socket.

.NET 5.0 e posteriores: um ou mais soquetes são descartados..NET 5.0 and later: One or more sockets are disposed.

Exemplos

O exemplo de código a seguir usa Select para determinar quais soquetes de escuta têm uma solicitação de conexão.The following code example uses Select to determine which listening sockets have a connection request.

      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.Select is a static method that determines the status of one or more Socket instances. Você deve posicionar um ou mais soquetes em um IList antes de poder usar o Select método.You must place one or more sockets into an IList before you can use the Select method. Verifique a legibilidade chamando Select with IList como o checkRead parâmetro.Check for readability by calling Select with the IList as the checkRead parameter. Para verificar os soquetes para gravação, use o checkWrite parâmetro.To check your sockets for writability, use the checkWrite parameter. Para detectar condições de erro, use checkError .For detecting error conditions, use checkError. Depois de chamar Select , o IList será preenchido apenas com os soquetes que atendem às condições.After calling Select, the IList will be filled with only those sockets that satisfy the conditions.

Se você estiver em um estado de escuta, a legibilidade significa que uma chamada para Accept terá sucesso sem bloqueio.If you are in a listening state, readability means that a call to Accept will succeed without blocking. Se você já aceitou a conexão, a legibilidade significa que os dados estão disponíveis para leitura.If you have already accepted the connection, readability means that data is available for reading. Nesses casos, todas as operações de recebimento terão sucesso sem bloqueio.In these cases, all receive operations will succeed without blocking. A legibilidade também pode indicar se o remoto Socket desligou a conexão; nesse caso, uma chamada para retornará Receive imediatamente, com zero bytes retornados.Readability can also indicate whether the remote Socket has shut down the connection; in that case a call to Receive will return immediately, with zero bytes returned.

Select retorna quando pelo menos um dos soquetes de interesse (os soquetes nas checkRead checkWrite listas, e checkError ) atende aos critérios especificados ou o microSeconds parâmetro é excedido, o que vier primeiro.Select returns when at least one of the sockets of interest (the sockets in the checkRead, checkWrite, and checkError lists) meets its specified criteria, or the microSeconds parameter is exceeded, whichever comes first. microSecondsA configuração para-1 especifica um tempo limite infinito.Setting microSeconds to -1 specifies an infinite time-out.

Se você fizer uma chamada de não bloqueio para Connect , gravação significa que você se conectou com êxito.If you make a nonblocking call to Connect, writability means that you have connected successfully. Se você já tiver uma conexão estabelecida, gravação significa que todas as operações de envio terão sucesso sem bloqueio.If you already have a connection established, writability means that all send operations will succeed without blocking.

Se você fez uma chamada sem bloqueio para Connect , o checkerror parâmetro identifica os soquetes que não foram conectados com êxito.If you have made a non-blocking call to Connect, the checkerror parameter identifies sockets that have not connected successfully.

Observação

Use o Poll método se você quiser apenas determinar o status de um único Socket .Use the Poll method if you only want to determine the status of a single Socket.

Observação

Esse método não pode detectar certos tipos de problemas de conexão, como um cabo de rede quebrado, ou que o host remoto foi desligado de forma innormal.This method cannot detect certain kinds of connection problems, such as a broken network cable, or that the remote host was shut down ungracefully. Você deve tentar enviar ou receber dados para detectar esses tipos de erros.You must attempt to send or receive data to detect these kinds of errors.

Observação

Se você receber um SocketException , use a SocketException.ErrorCode propriedade para obter o código de erro específico.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. 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.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Aplica-se a

Confira também