Socket.Select Método

Definición

Sobrecargas

Select(IList, IList, IList, TimeSpan)

Determina el estado de uno o varios sockets.

Select(IList, IList, IList, Int32)

Determina el estado de uno o varios sockets.

Select(IList, IList, IList, TimeSpan)

Source:
Socket.cs
Source:
Socket.cs
Source:
Socket.cs

Determina el estado de uno o varios sockets.

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

IList de instancias Socket para comprobar la legibilidad.

checkWrite
IList

IList de instancias Socket para comprobar la capacidad de escritura.

checkError
IList

IList de instancias Socket para comprobar errores.

timeout
TimeSpan

El valor de tiempo de espera. Un valor igual a -1 microsegundos indica un tiempo de espera infinito.

Excepciones

El checkReadparámetro , checkWriteo checkError es o está null vacío.

El checkReadparámetro , checkWriteo checkError contiene demasiados sockets.

era timeout menor que -1 microsegundos o mayor que MaxValue microsegundos

Error al intentar acceder al socket.

Se eliminaron uno o más sockets.

Se aplica a

Select(IList, IList, IList, Int32)

Source:
Socket.cs
Source:
Socket.cs
Source:
Socket.cs

Determina el estado de uno o varios 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

IList de instancias Socket para comprobar la legibilidad.

checkWrite
IList

IList de instancias Socket para comprobar la capacidad de escritura.

checkError
IList

IList de instancias Socket para comprobar errores.

microSeconds
Int32

Valor del tiempo de espera, en microsegundos. Un valor de -1 indica un tiempo de espera infinito.

Excepciones

El parámetro checkRead es null o está vacío.

- y -

El parámetro checkWrite es null o está vacío.

- y -

El parámetro checkError es null o está vacío.

Error al intentar acceder al socket.

.NET 5 y versiones posteriores: se eliminan uno o varios sockets.

El checkReadparámetro , checkWriteo checkError contiene demasiados sockets.

Ejemplos

En el ejemplo de código siguiente se usa Select para determinar qué sockets de escucha tienen una solicitud de conexión.

      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

Comentarios

Select es un método estático que determina el estado de una o varias Socket instancias. Debe colocar uno o varios sockets en un IList para poder usar el Select método . Compruebe la legibilidad llamando a Select con IList como el checkRead parámetro . Para comprobar la idoneidad de los sockets, use el checkWrite parámetro . Para detectar condiciones de error, use checkError. Después de llamar a Select, IList se rellenará con solo los sockets que cumplan las condiciones.

Si se encuentra en un estado de escucha, la legibilidad significa que una llamada a Accept se realizará correctamente sin bloquear. Si ya ha aceptado la conexión, la legibilidad significa que los datos están disponibles para su lectura. En estos casos, todas las operaciones de recepción se realizarán correctamente sin bloquear. La legibilidad también puede indicar si el remoto Socket ha cerrado la conexión; en ese caso, una llamada a Receive devolverá inmediatamente, con cero bytes devueltos.

Select devuelve cuando al menos uno de los sockets de interés (los sockets de las checkReadlistas , checkWritey checkError ) cumplen sus criterios especificados o se supera el microSeconds parámetro , lo que ocurra primero. Al establecer microSeconds en -1 se especifica un tiempo de espera infinito.

Si realiza una llamada sin bloqueo a Connect, la idoneidad significa que se ha conectado correctamente. Si ya tiene establecida una conexión, la idoneidad significa que todas las operaciones de envío se realizarán correctamente sin bloqueo.

Si ha realizado una llamada sin bloqueo a Connect, el checkerror parámetro identifica los sockets que no se han conectado correctamente.

Nota:

Use el Poll método si solo desea determinar el estado de un único Socket.

Nota:

Este método no puede detectar ciertos tipos de problemas de conexión, como un cable de red roto, o que el host remoto se cerró de forma incorrecta. Debe intentar enviar o recibir datos para detectar estos tipos de errores.

Nota

Si recibe un SocketException, use la SocketException.ErrorCode propiedad para obtener el código de error específico. Después de obtener este código, consulte la documentación del código de error de la API de Windows Sockets versión 2 para obtener una descripción detallada del error.

Consulte también

Se aplica a