Condividi tramite


Socket.Select Metodo

Definizione

Overload

Select(IList, IList, IList, TimeSpan)

Determina lo stato di uno o più socket.

Select(IList, IList, IList, Int32)

Determina lo stato di uno o più socket.

Select(IList, IList, IList, TimeSpan)

Origine:
Socket.cs
Origine:
Socket.cs
Origine:
Socket.cs

Determina lo stato di uno o più socket.

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)

Parametri

checkRead
IList

Un IList di istanze di Socket per verificare la leggibilità.

checkWrite
IList

Un IList di istanze di Socket per verificare la scrivibilità.

checkError
IList

Un IList di istanze di Socket per verificare la presenza di errori.

timeout
TimeSpan

Valore di timeout. Un valore uguale a -1 microsecondi indica un timeout infinito.

Eccezioni

I parametri checkRead, checkWritee checkError sono tutti null o vuoti. Almeno una delle checkRead, checkWriteo checkError deve contenere almeno un Socket.

Il parametro checkRead, checkWriteo checkError contiene troppi socket.

Il timeout è minore di -1 microsecondi o maggiore di MaxValue microsecondi

Si è verificato un errore durante il tentativo di accesso al socket.

Uno o più socket sono stati eliminati.

Si applica a

Select(IList, IList, IList, Int32)

Origine:
Socket.cs
Origine:
Socket.cs
Origine:
Socket.cs

Determina lo stato di uno o più socket.

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)

Parametri

checkRead
IList

Un IList di istanze di Socket per verificare la leggibilità.

checkWrite
IList

Un IList di istanze di Socket per verificare la scrivibilità.

checkError
IList

Un IList di istanze di Socket per verificare la presenza di errori.

microSeconds
Int32

Valore di timeout, espresso in microsecondi. Un valore -1 indica un timeout infinito.

Eccezioni

I parametri checkRead, checkWritee checkError sono tutti null o vuoti. Almeno una delle checkRead, checkWriteo checkError deve contenere almeno un Socket.

Si è verificato un errore durante il tentativo di accesso al socket.

.NET 5 e versioni successive: uno o più socket vengono eliminati.

Il parametro checkRead, checkWriteo checkError contiene troppi socket.

Esempio

L'esempio di codice seguente usa Select per determinare quali socket in ascolto hanno una richiesta di connessione.

      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

Commenti

Select è un metodo statico che determina lo stato di una o più istanze di Socket. È necessario inserire uno o più socket in un IList prima di poter usare il metodo Select. Verificare la leggibilità chiamando Select con il IList come parametro di checkRead. Per controllare la scrittura dei socket, usare il parametro checkWrite. Per rilevare le condizioni di errore, usare checkError. Dopo aver chiamato Select, il IList verrà riempito solo con i socket che soddisfano le condizioni.

Se si è in uno stato di ascolto, la leggibilità significa che una chiamata a Accept avrà esito positivo senza bloccare. Se la connessione è già stata accettata, la leggibilità indica che i dati sono disponibili per la lettura. In questi casi, tutte le operazioni di ricezione avranno esito positivo senza bloccare. La leggibilità può anche indicare se il Socket remoto ha arrestato la connessione; in tal caso, una chiamata a Receive restituirà immediatamente, con zero byte restituiti.

Select restituisce quando almeno uno dei socket di interesse (i socket nell'elenco checkRead, checkWritee checkError) soddisfa i criteri specificati oppure viene superato il parametro microSeconds, a condizione che venga raggiunto per primo. L'impostazione di microSeconds su -1 specifica un timeout infinito.

Se si effettua una chiamata non bloccante a Connect, la scrittura indica che la connessione è stata eseguita correttamente. Se è già stata stabilita una connessione, la scrittura significa che tutte le operazioni di invio avranno esito positivo senza bloccare.

Se è stata effettuata una chiamata non bloccante a Connect, il parametro checkerror identifica i socket che non sono connessi correttamente.

Nota

Utilizzare il metodo Poll se si vuole determinare solo lo stato di un singolo Socket.

Nota

Questo metodo non è in grado di rilevare determinati tipi di problemi di connessione, ad esempio un cavo di rete interrotto o che l'host remoto è stato arrestato in modo anomalo. È necessario tentare di inviare o ricevere dati per rilevare questi tipi di errori.

Nota

Se viene visualizzato un SocketException, utilizzare la proprietà SocketException.ErrorCode per ottenere il codice di errore specifico. Dopo aver ottenuto questo codice, fare riferimento al codice di errore dell'API Windows Sockets versione 2 documentazione per una descrizione dettagliata dell'errore.

Vedi anche

Si applica a