Socket.Select Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ü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
- timeout
- TimeSpan
Der Timeoutwert. Ein Wert, der -1 Mikrosekunden entspricht, gibt einen unendlichen Timeout an.
Ausnahmen
Die Parameter checkRead
, checkWrite
und checkError
sind alle null
oder leer. Mindestens ein checkRead
, checkWrite
oder checkError
muss mindestens einen Socketenthalten.
Der parameter checkRead
, checkWrite
oder 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
- microSeconds
- Int32
Der Timeoutwert in Mikrosekunden. Ein -1 Wert gibt einen unendlichen Timeout an.
Ausnahmen
Die Parameter checkRead
, checkWrite
und checkError
sind alle null
oder leer. Mindestens ein checkRead
, checkWrite
oder 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
, checkWrite
oder 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
, checkWrite
und 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.