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

Oggetto IList delle istanze di Socket di cui verificare la possibilità di lettura.

checkWrite
IList

Oggetto IList delle istanze di Socket di cui verificare la possibilità di scrittura.

checkError
IList

Oggetto IList delle istanze di Socket in cui verificare la presenza di errori.

timeout
TimeSpan

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

Eccezioni

Il checkReadparametro , checkWriteo checkError è null o vuoto.

Il checkReadparametro , checkWriteo checkError contiene troppi socket.

L'oggetto timeout era 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

Oggetto IList delle istanze di Socket di cui verificare la possibilità di lettura.

checkWrite
IList

Oggetto IList delle istanze di Socket di cui verificare la possibilità di scrittura.

checkError
IList

Oggetto IList delle istanze di Socket in cui verificare la presenza di errori.

microSeconds
Int32

Valore di timeout in microsecondi. Il valore -1 indica un periodo di timeout infinito.

Eccezioni

Il parametro checkRead è null o vuoto.

-e-

Il parametro checkWrite è null o vuoto

-e-

Il parametro checkError è null o vuoto.

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

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

Il checkReadparametro , checkWriteo checkError contiene troppi socket.

Esempio

Nell'esempio di codice seguente viene Select usato per determinare quali socket di 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ù Socket istanze. È necessario inserire uno o più socket in un IList oggetto prima di poter usare il Select metodo . Verificare la leggibilità chiamando Select con come IListcheckRead parametro . Per verificare la scrivibilità dei socket, usare il checkWrite parametro . Per rilevare le condizioni di errore, usare checkError. Dopo aver chiamato Select, l'oggetto 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à significa 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 telecomando Socket 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 negli checkReadelenchi , checkWritee checkError ) soddisfa i criteri specificati oppure il microSeconds parametro viene superato, a qualsiasi condizione viene restituita per prima. L'impostazione su microSeconds -1 specifica un timeout infinito.

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

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

Nota

Usare il Poll metodo se si vuole determinare solo lo stato di un singolo Socketoggetto .

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 si riceve un SocketExceptionoggetto , utilizzare la SocketException.ErrorCode proprietà per ottenere il codice di errore specifico. Dopo aver ottenuto questo codice, fare riferimento alla documentazione relativa al codice di errore dell'API Windows Sockets versione 2 per una descrizione dettagliata dell'errore.

Vedi anche

Si applica a