Freigeben über


Socket.Select-Methode

Bestimmt den Status eines oder mehrerer Sockets.

Namespace: System.Net.Sockets
Assembly: System (in system.dll)

Syntax

'Declaration
Public Shared Sub Select ( _
    checkRead As IList, _
    checkWrite As IList, _
    checkError As IList, _
    microSeconds As Integer _
)
'Usage
Dim checkRead As IList
Dim checkWrite As IList
Dim checkError As IList
Dim microSeconds As Integer

Socket.Select(checkRead, checkWrite, checkError, microSeconds)
public static void Select (
    IList checkRead,
    IList checkWrite,
    IList checkError,
    int microSeconds
)
public:
static void Select (
    IList^ checkRead, 
    IList^ checkWrite, 
    IList^ checkError, 
    int microSeconds
)
public static void Select (
    IList checkRead, 
    IList checkWrite, 
    IList checkError, 
    int microSeconds
)
public static function Select (
    checkRead : IList, 
    checkWrite : IList, 
    checkError : IList, 
    microSeconds : int
)

Parameter

  • checkRead
    Eine IList von Socket-Instanzen, deren Lesbarkeit überprüft werden soll.
  • checkWrite
    Eine IList von Socket-Instanzen, deren Schreibbarkeit überprüft werden soll.
  • checkError
    Eine IList von Socket-Instanzen, die auf Fehler geprüft werden sollen.
  • microSeconds
    Der Timeoutwert in Mikrosekunden. Der Wert -1 gibt ein unendliches Timeout an.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentNullException

Der checkRead-Parameter ist NULL (Nothing in Visual Basic) oder leer.

– und –

Der checkWrite-Parameter ist NULL (Nothing in Visual Basic) oder leer.

– und –

Der checkError-Parameter ist NULL (Nothing in Visual Basic) oder leer.

SocketException

Fehler beim Zugriff auf den Socket. Weitere Informationen finden Sie im Abschnitt Hinweise.

Hinweise

Select ist eine statische Methode, die den Status einer oder mehrerer Socket-Instanzen bestimmt. Sie müssen ein oder mehrere Sockets in eine IList einfügen, bevor Sie die Select-Methode verwenden können. Überprüfen Sie die Lesbarkeit durch einen Aufruf von Select mit IList als checkRead-Parameter. Mit dem checkWrite-Parameter können Sie überprüfen, ob die Sockets schreibgeschützt sind. Fehlerzustände können Sie mit checkError überprüfen. Nach dem Aufruf von Select wird die IList nur mit den Sockets gefüllt, die den Bedingungen entsprechen.

Im Überwachungszustand bedeutet Lesbarkeit, dass ein Aufruf von Accept ohne Blockieren ausgeführt wird. Wenn die Verbindung bereits angenommen wurde, bedeutet Lesefähigkeit, dass Daten zum Lesen zur Verfügung stehen. In diesem Fall werden alle Empfangsvorgänge ohne Blockieren ausgeführt. Mit Lesbarkeit kann auch angegeben werden, ob die Verbindung durch den Remote-Socket geschlossen wurde. In diesem Fall wird ein Aufruf von Receive sofort beendet, und es werden 0 (null) Bytes zurückgegeben.

Select wird beendet, wenn mindestens ein entsprechender Socket (die Sockets in der checkRead-Liste, der checkWrite-Liste und der checkError-Liste) mit den angegebenen Kriterien übereinstimmt, oder wenn der microSeconds-Parameter überstiegen wird, je nachdem, welche Bedingung zuerst eintritt. Durch das Festlegen von microSeconds auf -1 wird ein unendliches Timeout angegeben.

Bei einem nicht blockierenden Aufruf von Connect bedeutet Schreibbarkeit, dass die Verbindung erfolgreich hergestellt wurde. Wenn bereits eine Verbindung hergestellt wurde, bedeutet Schreibbarkeit, dass alle Sendevorgänge ohne Blockieren durchgeführt werden.

Bei einem nicht blockierenden Aufruf von Connect werden durch den checkerror-Parameter die Sockets gekennzeichnet, für die keine Verbindung hergestellt werden konnte.

Hinweis

Mit der Poll-Methode können Sie den Status eines einzelnen Socket bestimmen.

Hinweis

Mit dieser Methode können bestimmte Arten von Verbindungsproblemen, z. B. ein unterbrochenes Netzwerkkkabel oder das nicht ordnungsgemäße Herunterfahren des Remotehosts, nicht erkannt werden. Sie müssen versuchen, Daten zu senden oder zu empfangen, um diese Arten von Fehlern zu erkennen.

Hinweis

Wenn Sie eine SocketException erhalten, können Sie mit der SocketException.ErrorCode-Eigenschaft den spezifischen Fehlercode abrufen. Nachdem Sie diesen Code abgerufen haben, finden Sie in der Dokumentation der MSDN Library zu API-Fehlercodes unter Windows Sockets, Version 2, eine ausführliche Beschreibung des Fehlers.

Beispiel

Im folgenden Codebeispiel wird anhand von Select bestimmt, für welche überwachenden Sockets eine Verbindungsanforderung vorliegt.

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
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();
}
      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.get_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.set_Item(i, new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp));
    ((Socket)listenList.get_Item(i)).
        Bind(new IPEndPoint(ipAddress, 11000 + i));
    ((Socket)listenList.get_Item(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.get_Count(); i++) {
    acceptList.set_Item(i, ((Socket)listenList.get_Item(i)).Accept());
}

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Socket-Klasse
Socket-Member
System.Net.Sockets-Namespace
IList
Accept
Connect
Poll