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.

Der timeout war 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 Lauschockets eine Verbindungsanforderung aufweisen.

      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 mindestens einen Socket in einem platzieren, IList bevor Sie die Select -Methode verwenden können. Überprüfen Sie die Lesbarkeit, indem Sie mit dem IList als checkRead Parameter aufrufenSelect. Verwenden Sie den checkWrite Parameter, um Ihre Sockets auf Beschreibbarkeit zu überprüfen. Verwenden Sie checkErrorzum Erkennen von Fehlerbedingungen . Nach dem Aufruf Selectwird der IList nur mit den Sockets gefüllt, die die Bedingungen erfüllen.

Wenn Sie sich in einem Lauschzustand befinden, bedeutet die Lesbarkeit, dass ein Aufruf von erfolgreich ist, ohne zu Accept blockieren. Wenn Sie die Verbindung bereits akzeptiert haben, bedeutet 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 hat. In diesem Fall wird sofort ein Aufruf von Receive zurückgegeben, wobei null Bytes zurückgegeben werden.

Select gibt zurück, wenn mindestens einer der sockets von Interesse (die Sockets in den checkReadListen , checkWriteund checkError ) die angegebenen Kriterien erfüllt, oder wenn der microSeconds Parameter überschritten wird, je nachdem, was zuerst kommt. Die Einstellung microSeconds auf -1 gibt ein unendliches Timeout an.

Wenn Sie einen nicht blockierenden Aufruf von Connecttätigen, bedeutet Schreibbarkeit, dass Sie eine erfolgreiche Verbindung hergestellt haben. Wenn Sie bereits eine Verbindung hergestellt haben, bedeutet Schreibbarkeit, dass alle Sendevorgänge ohne Blockierung erfolgreich sind.

Wenn Sie einen nicht blockierenden Aufruf von Connectausgefü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 unterbrochenes 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 eine ausführliche Beschreibung des Fehlers in der Dokumentation zur Windows Sockets-API, Version 2 .

Weitere Informationen

Gilt für: