Partager via


Socket.Select Méthode

Définition

Surcharges

Select(IList, IList, IList, TimeSpan)

Détermine l’état d’un ou plusieurs sockets.

Select(IList, IList, IList, Int32)

Détermine l’état d’un ou plusieurs sockets.

Select(IList, IList, IList, TimeSpan)

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

Détermine l’état d’un ou plusieurs 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)

Paramètres

checkRead
IList

Une IList d’instances Socket pour vérifier la lisibilité.

checkWrite
IList

Une IList d’instances de Socket pour vérifier la facilité d’écriture.

checkError
IList

Une IList d’instances Socket pour rechercher des erreurs.

timeout
TimeSpan

Valeur du délai d’expiration. Une valeur égale à -1 microsecondes indique un délai d’expiration infini.

Exceptions

Les paramètres checkRead, checkWriteet checkError sont tous null ou vides. Au moins un de checkRead, checkWriteou checkError doit contenir au moins un Socket.

Le paramètre checkRead, checkWriteou checkError contient trop de sockets.

Le timeout était inférieur à -1 microsecondes ou supérieur à MaxValue microsecondes

Une erreur s’est produite lors de la tentative d’accès au socket.

Un ou plusieurs sockets ont été supprimés.

S’applique à

Select(IList, IList, IList, Int32)

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

Détermine l’état d’un ou plusieurs 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)

Paramètres

checkRead
IList

Une IList d’instances Socket pour vérifier la lisibilité.

checkWrite
IList

Une IList d’instances de Socket pour vérifier la facilité d’écriture.

checkError
IList

Une IList d’instances Socket pour rechercher des erreurs.

microSeconds
Int32

Valeur de délai d’attente, en microsecondes. Une valeur -1 indique un délai d’attente infini.

Exceptions

Les paramètres checkRead, checkWriteet checkError sont tous null ou vides. Au moins un de checkRead, checkWriteou checkError doit contenir au moins un Socket.

Une erreur s’est produite lors de la tentative d’accès au socket.

.NET 5 et versions ultérieures : un ou plusieurs sockets sont supprimés.

Le paramètre checkRead, checkWriteou checkError contient trop de sockets.

Exemples

L’exemple de code suivant utilise Select pour déterminer quels sockets d’écoute ont une demande de connexion.

      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

Remarques

Select est une méthode statique qui détermine l’état d’une ou plusieurs instances Socket. Vous devez placer un ou plusieurs sockets dans une IList avant de pouvoir utiliser la méthode Select. Vérifiez la lisibilité en appelant Select avec le IList comme paramètre de checkRead. Pour vérifier la facilité d’écriture de vos sockets, utilisez le paramètre checkWrite. Pour détecter les conditions d’erreur, utilisez checkError. Après avoir appelé Select, le IList sera rempli avec uniquement les sockets qui répondent aux conditions.

Si vous êtes dans un état d’écoute, la lisibilité signifie qu’un appel à Accept réussit sans bloquer. Si vous avez déjà accepté la connexion, la lisibilité signifie que les données sont disponibles pour la lecture. Dans ces cas, toutes les opérations de réception réussissent sans bloquer. La lisibilité peut également indiquer si le Socket distant a arrêté la connexion ; dans ce cas, un appel à Receive retourne immédiatement, avec zéro octet retourné.

Select retourne lorsqu’au moins un des sockets d’intérêt (les sockets dans le checkRead, checkWriteet les listes checkError) répondent à ses critères spécifiés, ou que le paramètre microSeconds est dépassé, selon ce qui se produit en premier. Définir microSeconds sur -1 spécifie un délai d’attente infini.

Si vous effectuez un appel non bloquant à Connect, l’écriture signifie que vous avez correctement connecté. Si vous disposez déjà d’une connexion établie, la facilité d’écriture signifie que toutes les opérations d’envoi réussissent sans bloquer.

Si vous avez effectué un appel non bloquant à Connect, le paramètre checkerror identifie les sockets qui n’ont pas été connectés avec succès.

Note

Utilisez la méthode Poll si vous souhaitez uniquement déterminer l’état d’une seule Socket.

Note

Cette méthode ne peut pas détecter certains types de problèmes de connexion, tels qu’un câble réseau défectueux, ou que l’hôte distant a été arrêté de manière incorrecte. Vous devez tenter d’envoyer ou de recevoir des données pour détecter ces types d’erreurs.

Note

Si vous recevez un SocketException, utilisez la propriété SocketException.ErrorCode pour obtenir le code d’erreur spécifique. Une fois que vous avez obtenu ce code, reportez-vous au code d’erreur de l’API Windows Sockets version 2 documentation pour obtenir une description détaillée de l’erreur.

Voir aussi

S’applique à