Socket.Select Metoda

Definice

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)

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

checkRead
IList

An IList of Socket instances to check for readability.

checkWrite
IList

An IList of Socket instances to check for writability.

checkError
IList

Socket Počet IList instancí ke kontrole chyb.

timeout
TimeSpan

Hodnota časového limitu. Hodnota rovna -1 mikrosekundám označuje nekonečný časový limit.

Výjimky

Parametr checkRead, checkWritenebo checkError je null prázdný.

Parametr checkRead, checkWritenebo checkError obsahuje příliš mnoho soketů.

Hodnota timeout byla menší než -1 mikrosekundy nebo větší než MaxValue mikrosekundy.

Při pokusu o přístup k soketu došlo k chybě.

Jeden nebo více soketů bylo odstraněno.

Platí pro

Select(IList, IList, IList, Int32)

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

checkRead
IList

An IList of Socket instances to check for readability.

checkWrite
IList

An IList of Socket instances to check for writability.

checkError
IList

Socket Počet IList instancí ke kontrole chyb.

microSeconds
Int32

Hodnota časového limitu v mikrosekundách. Hodnota -1 označuje nekonečný časový limit.

Výjimky

Parametr checkRead je null nebo je prázdný.

-A-

Parametr checkWrite je null nebo je prázdný.

-A-

Parametr checkError je null nebo je prázdný.

Při pokusu o přístup k soketu došlo k chybě.

.NET 5 a novější: Jeden nebo více soketů je vyřazeno.

Parametr checkRead, checkWritenebo checkError obsahuje příliš mnoho soketů.

Příklady

Následující příklad kódu používá Select k určení, které naslouchací 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 Socket instancí. Před použitím metody musíte do objektu IList umístit jeden nebo více soketů Select . Zkontrolujte čitelnost voláním Select parametru checkRead jako parametru IList . Pokud chcete zkontrolovat zapisovatelnost soketů, použijte checkWrite parametr . Pokud chcete zjistit chybové stavy, použijte checkError. Po volání Selectse do pole IList vyplní pouze ty sokety, které splňují podmínky.

Pokud jste ve stavu naslouchání, čitelnost znamená, že volání Accept proběhne ú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é indikovat, jestli vzdálené zařízení Socket ukončilo připojení. V takovém případě se okamžitě vrátí volání Receive s nulovými bajty.

Select vrátí, pokud alespoň jeden ze soketů, které vás zajímají (sokety v checkReadseznamech , checkWritea checkError ) splňuje zadaná kritéria nebo microSeconds je parametr překročen, podle toho, co nastane dříve. Nastavení microSeconds na -1 určuje nekonečný časový limit.

Pokud provedete neblokující volání , Connectzápis znamená, že jste se úspěšně připojili. Pokud už máte připojení navázáno, znamená to, že všechny operace odeslání budou úspěšné bez blokování.

Pokud jste provedli neblokující volání , Connectcheckerror parametr identifikuje sokety, které se úspěšně nepřipojily.

Poznámka

Metodu použijte, Poll pokud chcete určit pouze stav jednoho Socket.

Poznámka

Tato metoda nemůže rozpoznat určité druhy problémů s připojením, například poškozený síťový kabel nebo že vzdálený hostitel byl nechtěně vypnut. Pokud chcete zjistit tyto druhy chyb, musíte se pokusit odeslat nebo přijmout data.

Poznámka

Pokud se zobrazí SocketException, použijte SocketException.ErrorCode vlastnost k získání konkrétního kódu chyby. Jakmile tento kód získáte, projděte si podrobný popis chyby v dokumentaci k rozhraní API windows Sockets verze 2 .

Viz také

Platí pro