Socket.Select(IList, IList, IList, Int32) Methode

Definition

Bestimmt den Status von einem oder mehreren Sockets.Determines the status of one or more 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);
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, bei denen geprüft werden soll, ob sie gelesen werden können.An IList of Socket instances to check for readability.

checkWrite
IList

Eine IList von Socket-Instanzen, bei denen geprüft werden soll, ob in sie geschrieben werden kann.An IList of Socket instances to check for writability.

checkError
IList

Eine IList von Socket-Instanzen, die auf Fehler überprüft werden sollen.An IList of Socket instances to check for errors.

microSeconds
Int32

Der Timeoutwert in Mikrosekunden.The time-out value, in microseconds. Ein Wert von -1 gibt ein unendliches Timeout an.A -1 value indicates an infinite time-out.

Ausnahmen

Der checkRead-Parameter ist null oder leer.The checkRead parameter is null or empty.

- und --and- Der checkWrite-Parameter ist null oder leer.The checkWrite parameter is null or empty - und --and- Der checkError-Parameter ist null oder leer.The checkError parameter is null or empty.

Fehler beim Versuch, auf den Socket zuzugreifen.An error occurred when attempting to access the socket.

Beispiele

Im folgenden Codebeispiel wird Select verwendet, um zu bestimmen, welche Abhör Sockets eine Verbindungsanforderung haben.The following code example uses Select to determine which listening sockets have a connection request.

      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 von mindestens einer Socket Instanz bestimmt.Select is a static method that determines the status of one or more Socket instances. Sie müssen eine oder mehrere Sockets in eine IList platzieren, bevor Sie die Select-Methode verwenden können.You must place one or more sockets into an IList before you can use the Select method. Überprüfen Sie die Lesbarkeit, indem Sie Select mit dem IList als checkRead Parameter aufrufen.Check for readability by calling Select with the IList as the checkRead parameter. Verwenden Sie den checkWrite-Parameter, um die Sockets auf die Schreib barkeit zu überprüfen.To check your sockets for writability, use the checkWrite parameter. Verwenden Sie zum Erkennen von Fehlerbedingungen checkError.For detecting error conditions, use checkError. Nach dem Aufrufen von Selectwerden die IList nur mit den Sockets aufgefüllt, die die Bedingungen erfüllen.After calling Select, the IList will be filled with only those sockets that satisfy the conditions.

Wenn Sie sich in einem Empfangs Zustand befinden, bedeutet die Lesbarkeit, dass ein Accept-Aufrufe ohne Blockierung erfolgreich verlaufen wird.If you are in a listening state, readability means that a call to Accept will succeed without blocking. Wenn Sie die Verbindung bereits angenommen haben, bedeutet die Lesbarkeit, dass Daten zum Lesen verfügbar sind.If you have already accepted the connection, readability means that data is available for reading. In diesen Fällen werden alle Empfangs Vorgänge ohne Blockierung erfolgreich ausgeführt.In these cases, all receive operations will succeed without blocking. Die Lesbarkeit kann auch angeben, ob die Remote Socket die Verbindung heruntergefahren hat. in diesem Fall wird ein AufrufReceive sofort zurückgegeben, wobei null Bytes zurückgegeben werden.Readability can also indicate whether the remote Socket has shut down the connection; in that case a call to Receive will return immediately, with zero bytes returned.

Select wird zurückgegeben, wenn mindestens eine der zu berücksichtigenden Sockets (die Sockets in der checkRead, checkWriteund checkError Listen) die angegebenen Kriterien erfüllt oder der microSeconds Parameter überschritten wird, je nachdem, welcher Wert zuerst eintritt.Select returns when at least one of the sockets of interest (the sockets in the checkRead, checkWrite, and checkError lists) meets its specified criteria, or the microSeconds parameter is exceeded, whichever comes first. Wenn Sie microSeconds auf-1 festlegen, wird ein unendliches Timeout angegeben.Setting microSeconds to -1 specifies an infinite time-out.

Wenn Sie einen nicht blockierenden AufrufsConnectvornehmen, bedeutet Schreibbarkeit, dass Sie erfolgreich eine Verbindung hergestellt haben.If you make a nonblocking call to Connect, writability means that you have connected successfully. Wenn Sie bereits eine Verbindung hergestellt haben, bedeutet die Schreib barkeit, dass alle Sende Vorgänge ohne Blockierung erfolgreich ausgeführt werden.If you already have a connection established, writability means that all send operations will succeed without blocking.

Wenn Sie einen nicht blockierenden Connectaufgerufen haben, identifiziert der checkerror Parameter Sockets, die nicht erfolgreich verbunden wurden.If you have made a non-blocking call to Connect, the checkerror parameter identifies sockets that have not connected successfully.

Hinweis

Verwenden Sie die Poll-Methode, wenn Sie nur den Status eines einzelnen Socketbestimmen möchten.Use the Poll method if you only want to determine the status of a single Socket.

Hinweis

Diese Methode kann bestimmte Arten von Verbindungsproblemen, wie z. b. ein fehlerhaftes Netzwerkkabel, nicht erkennen, oder der Remote Host wurde nicht ordnungsgemäß heruntergefahren.This method cannot detect certain kinds of connection problems, such as a broken network cable, or that the remote host was shut down ungracefully. Sie müssen versuchen, Daten zu senden oder zu empfangen, um diese Arten von Fehlern zu erkennen.You must attempt to send or receive data to detect these kinds of errors.

Hinweis

Wenn Sie erhalten eine SocketException, verwenden die SocketException.ErrorCode Eigenschaft, um den spezifischen Fehlercode zu erhalten.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. Nachdem Sie diesen Code abgerufen haben, finden Sie in der API-Fehlercode Dokumentation der Windows Sockets, Version 2 , eine ausführliche Beschreibung des Fehlers.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Gilt für:

Siehe auch