Socket.Select Methode

Definition

Überlädt

Select(IList, IList, IList, TimeSpan)

Bestimmt den Status von einem oder mehreren Sockets.

Select(IList, IList, IList, Int32)

Bestimmt den Status von einem oder mehreren Sockets.

Select(IList, IList, IList, TimeSpan)

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

Bestimmt den Status von einem oder mehreren 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, bei denen geprüft werden soll, ob sie gelesen werden können.

checkWrite
IList

Eine IList von Socket-Instanzen, bei denen geprüft werden soll, ob in sie geschrieben werden kann.

checkError
IList

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

timeout
TimeSpan

Der Timeoutwert. Ein Wert von -1 Mikrosekunden gibt ein unendliches Timeout an.

Ausnahmen

Der checkReadParameter , checkWriteoder checkError ist null oder leer.

Der checkReadParameter , checkWriteoder checkError enthält zu viele Sockets.

War timeout kleiner als -1 Mikrosekunden oder größer als MaxValue Mikrosekunden

Fehler beim Versuch, auf den Socket zuzugreifen.

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 von einem oder mehreren 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, bei denen geprüft werden soll, ob sie gelesen werden können.

checkWrite
IList

Eine IList von Socket-Instanzen, bei denen geprüft werden soll, ob in sie geschrieben werden kann.

checkError
IList

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

microSeconds
Int32

Der Timeoutwert in Mikrosekunden. Ein Wert von -1 gibt ein unendliches Timeout an.

Ausnahmen

Der checkRead-Parameter ist null oder leer.

- und -

Der checkWrite-Parameter ist null oder leer.

- und -

Der checkError-Parameter ist null oder leer.

Fehler beim Versuch, auf den Socket zuzugreifen.

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

Der checkReadParameter , checkWriteoder checkError enthält zu viele Sockets.

Beispiele

Im folgenden Codebeispiel wird verwendet Select , um zu bestimmen, welche lauschenden Sockets ü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

Selectist eine statische Methode, die die status einer oder Socket mehrerer Instanzen bestimmt. Sie müssen einen oder mehrere Sockets in einem platzieren, IList bevor Sie die Select -Methode verwenden können. Überprüfen Sie die Lesbarkeit, indem Sie mit dem IList -checkReadParameter aufrufenSelect. Verwenden Sie den checkWrite -Parameter, um Ihre Sockets auf Beschreibbarkeit zu überprüfen. Verwenden Sie checkErrorzum Erkennen von Fehlerbedingungen . Nach dem Aufrufen Selectvon wird nur IList mit den Sockets gefüllt, die die Bedingungen erfüllen.

Wenn Sie sich in einem Lauschzustand befinden, bedeutet die Lesbarkeit, dass ein Aufruf von Accept ohne Blockierung erfolgreich ist. Wenn Sie die Verbindung bereits akzeptiert haben, bedeutet die Lesbarkeit, dass Daten zum Lesen verfügbar sind. In diesen Fällen sind alle Empfangsvorgänge ohne Blockierung erfolgreich. Die Lesbarkeit kann auch angeben, ob die Remoteverbindung Socket beendet wurde. 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 relevanten Sockets (die Sockets in den checkReadListen , checkWriteund checkError ) die angegebenen Kriterien erfüllt oder der microSeconds Parameter überschritten wird, je nachdem, was zuerst eintritt. Die Einstellung microSeconds auf -1 gibt ein unbegrenztes Timeout an.

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

Wenn Sie einen nicht blockierenden Aufruf von Connectdurchgeführt haben, identifiziert der checkerror Parameter Sockets, die nicht erfolgreich verbunden wurden.

Hinweis

Verwenden Sie die Poll -Methode, wenn Sie nur die status eines einzelnen Socketbestimmen möchten.

Hinweis

Diese Methode kann bestimmte Arten von Verbindungsprobleme nicht erkennen, z. B. ein beschädigtes Netzwerkkabel, oder dass der Remotehost nicht ordnungsgemäß heruntergefahren wurde. Sie müssen versuchen, Daten zu senden oder zu empfangen, um diese Art von Fehlern zu erkennen.

Hinweis

Wenn Sie erhalten eine SocketException, verwenden die SocketException.ErrorCode Eigenschaft, um den spezifischen Fehlercode zu erhalten. Nachdem Sie diesen Code erhalten haben, finden Sie in der Dokumentation zu Windows Sockets Version 2-API-Fehlercode eine ausführliche Beschreibung des Fehlers.

Weitere Informationen

Gilt für: