Socket.Select Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Przeciążenia
Select(IList, IList, IList, TimeSpan) |
Określa stan co najmniej jednego gniazda. |
Select(IList, IList, IList, Int32) |
Określa stan co najmniej jednego gniazda. |
Select(IList, IList, IList, TimeSpan)
- Source:
- Socket.cs
- Source:
- Socket.cs
- Source:
- Socket.cs
Określa stan co najmniej jednego gniazda.
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)
Parametry
- timeout
- TimeSpan
Wartość limitu czasu. Wartość równa -1 mikrosekundom wskazuje nieskończony limit czasu.
Wyjątki
Parametr checkRead
, checkWrite
lub checkError
jest null
pusty.
Parametr checkRead
, checkWrite
lub checkError
zawiera zbyt wiele gniazd.
Wartość timeout
była mniejsza niż -1 mikrosekund lub większa niż MaxValue mikrosekundy
Wystąpił błąd podczas próby uzyskania dostępu do gniazda.
Co najmniej jedno gniazdo zostało usunięte.
Dotyczy
Select(IList, IList, IList, Int32)
- Source:
- Socket.cs
- Source:
- Socket.cs
- Source:
- Socket.cs
Określa stan co najmniej jednego gniazda.
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)
Parametry
- microSeconds
- Int32
Wartość limitu czasu w mikrosekundach. Wartość -1 wskazuje nieskończony limit czasu.
Wyjątki
Parametr checkRead
jest null
lub jest pusty.
-I-
Parametr checkWrite
jest null
lub jest pusty
-I-
Parametr checkError
jest null
lub jest pusty.
Wystąpił błąd podczas próby uzyskania dostępu do gniazda.
.NET 5 i nowsze: co najmniej jedno gniazdo jest usuwane.
Parametr checkRead
, checkWrite
lub checkError
zawiera zbyt wiele gniazd.
Przykłady
Poniższy przykład kodu używa metody Select do określenia, które gniazda nasłuchiwania mają żądanie połączenia.
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
Uwagi
Select to metoda statyczna, która określa stan co najmniej jednego Socket wystąpienia. Przed użyciem IListSelect metody należy umieścić co najmniej jedno gniazdo. Sprawdź czytelność, wywołując Select parametr IList jako checkRead
parametr . Aby sprawdzić gniazda pod kątem zapisu, użyj parametru checkWrite
. Aby wykryć warunki błędu, użyj polecenia checkError
. Po wywołaniu SelectIList polecenia element zostanie wypełniony tylko tymi gniazdami, które spełniają warunki.
Jeśli jesteś w stanie nasłuchiwania, czytelność oznacza, że wywołanie Accept zakończy się powodzeniem bez blokowania. Jeśli połączenie zostało już zaakceptowane, czytelność oznacza, że dane są dostępne do odczytu. W takich przypadkach wszystkie operacje odbierania zostaną wykonane pomyślnie bez blokowania. Czytelność może również wskazywać, czy zdalne Socket połączenie zostało zamknięte. W takim przypadku wywołanie, które Receive zostanie zwrócone natychmiast, z zwróconymi zero bajtów.
Select zwraca wartość, gdy co najmniej jedno z gniazd zainteresowania (gniazda w checkRead
listach , checkWrite
i checkError
) spełnia określone kryteria lub microSeconds
parametr zostanie przekroczony, w zależności od tego, co nastąpi wcześniej. Ustawienie microSeconds
na -1 określa nieskończony limit czasu.
Jeśli wywołanie nieblokujące zostanie nawiązane z Connectusługą , zapis oznacza, że połączenie zostało nawiązane pomyślnie. Jeśli masz już nawiązane połączenie, zapis oznacza, że wszystkie operacje wysyłania powiedzą się bez blokowania.
Jeśli wywołanie nieblokujące zostało nawiązane z Connectusługą , checkerror
parametr identyfikuje gniazda, które nie zostały pomyślnie połączone.
Uwaga
Ta metoda nie może wykryć niektórych rodzajów problemów z połączeniem, takich jak uszkodzony kabel sieciowy lub że host zdalny został wyłączony niegracecznie. Aby wykryć tego rodzaju błędy, należy spróbować wysłać lub odebrać dane.
Uwaga
Jeśli zostanie wyświetlony element SocketException, użyj SocketException.ErrorCode właściwości , aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z dokumentacją kodu błędu interfejsu API gniazda systemu Windows w wersji 2 , aby uzyskać szczegółowy opis błędu.
Zobacz też
Dotyczy
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla