Socket.Select Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Přetížení
Select(IList, IList, IList, TimeSpan) |
Určuje stav jednoho nebo více soketů. |
Select(IList, IList, IList, Int32) |
Určuje stav jednoho nebo více soketů. |
Select(IList, IList, IList, TimeSpan)
- Zdroj:
- Socket.cs
- Zdroj:
- Socket.cs
- Zdroj:
- Socket.cs
Určuje stav jednoho nebo více soketů.
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
Hodnota časového limitu. Hodnota rovna -1 mikrosekund označuje nekonečný časový limit.
Výjimky
Parametry checkRead
, checkWrite
a checkError
jsou všechny null
nebo prázdné. Nejméně jeden checkRead
, checkWrite
nebo checkError
musí obsahovat alespoň jeden Socket.
Parametr checkRead
, checkWrite
nebo checkError
obsahuje příliš mnoho soketů.
timeout
byla menší než -1 mikrosekund nebo větší než MaxValue mikrosekundy.
Při pokusu o přístup k soketu došlo k chybě.
Jeden nebo více soketů bylo uvolněno.
Platí pro
Select(IList, IList, IList, Int32)
- Zdroj:
- Socket.cs
- Zdroj:
- Socket.cs
- Zdroj:
- Socket.cs
Určuje stav jednoho nebo více soketů.
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
Hodnota časového limitu v mikrosekundách. Hodnota -1 označuje nekonečný časový limit.
Výjimky
Parametry checkRead
, checkWrite
a checkError
jsou všechny null
nebo prázdné. Nejméně jeden checkRead
, checkWrite
nebo checkError
musí obsahovat alespoň jeden Socket.
Při pokusu o přístup k soketu došlo k chybě.
.NET 5 a novější: Jeden nebo více soketů se odstraní.
Parametr checkRead
, checkWrite
nebo checkError
obsahuje příliš mnoho soketů.
Příklady
Následující příklad kódu používá Select k určení, které naslouchácí sokety mají požadavek na připojení.
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
Poznámky
Select je statická metoda, která určuje stav jedné nebo více instancí Socket. Před použitím metody Select je nutné umístit jeden nebo více soketů do IList. Zkontrolujte čitelnost voláním Select s IList jako parametrem checkRead
. Pokud chcete zkontrolovat zapisovatelnost soketů, použijte parametr checkWrite
. Při zjišťování chybových podmínek použijte checkError
. Po volání Selectse IList vyplní pouze sokety, které splňují podmínky.
Pokud jste ve stavu naslouchání, čitelnost znamená, že volání Accept bude úspěšné bez blokování. Pokud jste připojení už přijali, čitelnost znamená, že data jsou k dispozici pro čtení. V těchto případech budou všechny operace příjmu úspěšné bez blokování. Čitelnost může také znamenat, jestli vzdálené Socket vypnulo připojení; v takovém případě se volání Receive vrátí okamžitě s nulovými bajty vrácenými.
Select vrátí, když alespoň jeden soket zájmu (sokety v checkRead
, checkWrite
a checkError
seznamech) splňují zadaná kritéria nebo je překročen parametr microSeconds
podle toho, co nastane dříve. Nastavení microSeconds
na -1 určuje nekonečný časový limit.
Pokud provedete neblokující volání Connect, zapisovatelnost znamená, že jste se úspěšně připojili. Pokud už máte vytvořené připojení, zapisovatelnost znamená, že všechny operace odesílání budou úspěšné bez blokování.
Pokud jste neblokovali volání Connect, parametr checkerror
identifikuje sokety, které nebyly úspěšně připojeny.
Poznámka
Tato metoda nemůže rozpoznat určité druhy problémů s připojením, jako je poškozený síťový kabel nebo že vzdálený hostitel byl nerušeně vypnutý. Pokud chcete zjistit tyto druhy chyb, musíte se pokusit odesílat nebo přijímat data.
Poznámka
Pokud se zobrazí SocketException, použijte vlastnost SocketException.ErrorCode k získání konkrétního kódu chyby. Po získání tohoto kódu si přečtěte kód chyby rozhraní API Windows Sockets verze 2 dokumentaci k podrobnému popisu chyby.