Freigeben über


Socket.Select Methode

Definition

Überlädt

Select(IList, IList, IList, TimeSpan)

Bestimmt den Status eines oder mehrerer Sockets.

Select(IList, IList, IList, Int32)

Bestimmt den Status eines oder mehrerer Sockets.

Select(IList, IList, IList, TimeSpan)

Quelle:
Socket.cs
Quelle:
Socket.cs
Quelle:
Socket.cs

Bestimmt den Status eines oder mehrerer 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)

Parameter

checkRead
IList

Eine IList von Socket Instanzen, um die Lesbarkeit zu überprüfen.

checkWrite
IList

Eine IList von Socket Instanzen, die auf Schreibbarkeit überprüft werden sollen.

checkError
IList

Eine IList von Socket Instanzen, die auf Fehler überprüft werden sollen.

timeout
TimeSpan

Der Timeoutwert. Ein Wert, der -1 Mikrosekunden entspricht, gibt einen unendlichen Timeout an.

Ausnahmen

Die Parameter checkRead, checkWriteund checkError sind alle null oder leer. Mindestens ein checkRead, checkWriteoder checkError muss mindestens einen Socketenthalten.

Der parameter checkRead, checkWriteoder checkError enthält zu viele Sockets.

Die timeout war kleiner als -1 Mikrosekunden oder größer als MaxValue Mikrosekunden.

Beim Versuch, auf den Socket zuzugreifen, ist ein Fehler aufgetreten.

Mindestens ein Socket wurde verworfen.

Gilt für:

Select(IList, IList, IList, Int32)

Quelle:
Socket.cs
Quelle:
Socket.cs
Quelle:
Socket.cs

Bestimmt den Status eines oder mehrerer 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)

Parameter

checkRead
IList

Eine IList von Socket Instanzen, um die Lesbarkeit zu überprüfen.

checkWrite
IList

Eine IList von Socket Instanzen, die auf Schreibbarkeit überprüft werden sollen.

checkError
IList

Eine IList von Socket Instanzen, die auf Fehler überprüft werden sollen.

microSeconds
Int32

Der Timeoutwert in Mikrosekunden. Ein -1 Wert gibt einen unendlichen Timeout an.

Ausnahmen

Die Parameter checkRead, checkWriteund checkError sind alle null oder leer. Mindestens ein checkRead, checkWriteoder checkError muss mindestens einen Socketenthalten.

Beim Versuch, auf den Socket zuzugreifen, ist ein Fehler aufgetreten.

.NET 5 und höher: Mindestens ein Socket wird verworfen.

Der parameter checkRead, checkWriteoder checkError enthält zu viele Sockets.

Beispiele

Im folgenden Codebeispiel wird Select verwendet, um zu bestimmen, welche Überwachungssockets über eine Verbindungsanforderung verfügen.

      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

Hinweise

Select ist eine statische Methode, die den Status einer oder mehrerer Socket Instanzen bestimmt. Sie müssen einen oder mehrere Sockets in einem IList platzieren, bevor Sie die Select-Methode verwenden können. Überprüfen Sie die Lesbarkeit, indem Sie Select mit dem IList als checkRead-Parameter aufrufen. Verwenden Sie den checkWrite-Parameter, um die Sockets auf Schreibbarkeit zu überprüfen. Verwenden Sie checkError, um Fehlerbedingungen zu erkennen. Nach dem Aufrufen von Selectwird die IList nur mit den Sockets gefüllt, die die Bedingungen erfüllen.

Wenn Sie sich in einem Überwachungszustand befinden, bedeutet die Lesbarkeit, dass ein Aufruf von Accept ohne Blockieren erfolgreich ist. Wenn Sie die Verbindung bereits akzeptiert haben, bedeutet die Lesbarkeit, dass Daten zum Lesen verfügbar sind. In diesen Fällen werden alle Empfangsvorgänge ohne Blockierung erfolgreich ausgeführt. Die Lesbarkeit kann auch angeben, ob die Remote-Socket die Verbindung heruntergefahren hat; in diesem Fall wird ein Aufruf von Receive sofort zurückgegeben, wobei null Bytes zurückgegeben werden.

Select gibt zurück, wenn mindestens einer der interessanten Sockets (die Sockets in der checkRead, checkWriteund checkError Listen) die angegebenen Kriterien erfüllt, oder der microSeconds Parameter wird überschritten, je nachdem, was zuerst kommt. Wenn microSeconds auf -1 festgelegt wird, wird ein unendliches Timeout angegeben.

Wenn Sie einen nicht blockierenden Aufruf an Connectdurchführen, bedeutet die Schreibbarkeit, dass Sie erfolgreich eine Verbindung hergestellt haben. Wenn Sie bereits eine Verbindung hergestellt haben, bedeutet die Schreibbarkeit, dass alle Sendevorgänge ohne Blockierung erfolgreich ausgeführt werden.

Wenn Sie einen nicht blockierenden Aufruf an Connectvorgenommen haben, identifiziert der checkerror-Parameter Sockets, die nicht erfolgreich verbunden wurden.

Anmerkung

Verwenden Sie die Poll-Methode, wenn Sie nur den Status eines einzelnen Socketermitteln möchten.

Anmerkung

Diese Methode kann bestimmte Arten von Verbindungsproblemen nicht erkennen, z. B. ein fehlerhaftes Netzwerkkabel oder dass der Remotehost unauffällig heruntergefahren wurde. Sie müssen versuchen, Daten zu senden oder zu empfangen, um diese Arten von Fehlern zu erkennen.

Anmerkung

Wenn Sie eine SocketExceptionerhalten, verwenden Sie die SocketException.ErrorCode-Eigenschaft, um den spezifischen Fehlercode abzurufen. Nachdem Sie diesen Code erhalten haben, lesen Sie den Windows Sockets Version 2-API-Fehlercode Dokumentation, um eine detaillierte Beschreibung des Fehlers zu erhalten.

Weitere Informationen

Gilt für: