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
El valor de tiempo de espera. Un valor igual a -1 microsegundos indica un tiempo de espera infinito.
Excepciones
El checkRead
parámetro , checkWrite
o checkError
es o está null
vacío.
El checkRead
parámetro , checkWrite
o 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
- 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 checkRead
parámetro , 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 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 checkRead
listas , checkWrite
y 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
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de