Socket.Select Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- timeout
- TimeSpan
Valor de tiempo de espera. Un valor igual a -1 microsegundos indica un tiempo de espera infinito.
Excepciones
Los parámetros checkRead
, checkWrite
y checkError
son todos null
o vacíos. Al menos uno de checkRead
, checkWrite
o checkError
debe contener al menos un Socket.
El parámetro checkRead
, checkWrite
o 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
- microSeconds
- Int32
Valor de tiempo de espera, en microsegundos. Un valor de -1 indica un tiempo de espera infinito.
Excepciones
Los parámetros checkRead
, checkWrite
y checkError
son todos null
o vacíos. Al menos uno de checkRead
, checkWrite
o 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
, checkWrite
o 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
, checkWrite
y 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
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.