Compartir vía


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

Un IList de instancias de Socket para comprobar la legibilidad.

checkWrite
IList

Un IList de instancias de Socket para comprobar la writy.

checkError
IList

Un IList de instancias de Socket para comprobar si hay errores.

timeout
TimeSpan

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

Excepciones

Los parámetros checkRead, checkWritey checkError son todos null o vacíos. Al menos uno de checkRead, checkWriteo checkError debe contener al menos un Socket.

El parámetro checkRead, checkWriteo checkError contiene demasiados sockets.

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

Error al intentar acceder al socket.

Se ha eliminado uno o varios 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

Un IList de instancias de Socket para comprobar la legibilidad.

checkWrite
IList

Un IList de instancias de Socket para comprobar la writy.

checkError
IList

Un IList de instancias de Socket para comprobar si hay errores.

microSeconds
Int32

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

Excepciones

Los parámetros checkRead, checkWritey checkError son todos null o vacíos. Al menos uno de checkRead, checkWriteo checkError debe contener al menos un Socket.

Error al intentar acceder al socket.

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

El parámetro checkRead, 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 instancias de Socket. Debe colocar uno o varios sockets en un IList para poder usar el método Select. Compruebe la legibilidad llamando a Select con el IList como parámetro checkRead. Para comprobar la writy de los sockets, use el parámetro checkWrite. Para detectar condiciones de error, use checkError. Después de llamar a Select, el IList se rellenará solo con 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 bloqueo. Si ya ha aceptado la conexión, la legibilidad significa que los datos están disponibles para la lectura. En estos casos, todas las operaciones de recepción se realizarán correctamente sin bloqueo. La legibilidad también puede indicar si el Socket remoto ha apagado 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 la checkRead, checkWritey checkError listas) cumplen sus criterios especificados o se supera el parámetro microSeconds, lo que ocurra primero. Establecer microSeconds en -1 especifica un tiempo de espera infinito.

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

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

Nota

Use el método Poll 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 propiedad SocketException.ErrorCode para obtener el código de error específico. Después de obtener este código, consulte el código de error de la API versión 2 de Windows Sockets documentación para obtener una descripción detallada del error.

Consulte también

Se aplica a