Socket.Select Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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
- timeout
- TimeSpan
Valore di timeout. Un valore uguale a -1 microsecondi indica un timeout infinito.
Eccezioni
I parametri checkRead
, checkWrite
e checkError
sono tutti null
o vuoti. Almeno una delle checkRead
, checkWrite
o checkError
deve contenere almeno un Socket.
Il parametro checkRead
, checkWrite
o 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
- microSeconds
- Int32
Valore di timeout, espresso in microsecondi. Un valore -1 indica un timeout infinito.
Eccezioni
I parametri checkRead
, checkWrite
e checkError
sono tutti null
o vuoti. Almeno una delle checkRead
, checkWrite
o 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
, checkWrite
o 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
, checkWrite
e 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
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.