Udostępnij za pośrednictwem


Socket.Select Metoda

Definicja

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)

Źródło:
Socket.cs
Źródło:
Socket.cs
Źródło:
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

checkRead
IList

IList wystąpień Socket w celu sprawdzenia czytelności.

checkWrite
IList

IList wystąpień Socket w celu sprawdzenia możliwości zapisu.

checkError
IList

IList wystąpień Socket w celu sprawdzenia błędów.

timeout
TimeSpan

Wartość limitu czasu. Wartość równa -1 mikrosekund wskazuje nieskończony limit czasu.

Wyjątki

Parametry checkRead, checkWritei checkErrornull lub puste. Co najmniej jeden z checkRead, checkWritelub checkError musi zawierać co najmniej jeden Socket.

Parametr checkRead, checkWritelub checkError zawiera zbyt wiele gniazd.

timeout była mniejsza niż mikrosekundy -1 lub większa niż mikrosekundy MaxValue

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)

Źródło:
Socket.cs
Źródło:
Socket.cs
Źródło:
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

checkRead
IList

IList wystąpień Socket w celu sprawdzenia czytelności.

checkWrite
IList

IList wystąpień Socket w celu sprawdzenia możliwości zapisu.

checkError
IList

IList wystąpień Socket w celu sprawdzenia błędów.

microSeconds
Int32

Wartość limitu czasu w mikrosekundach. Wartość -1 wskazuje nieskończony limit czasu.

Wyjątki

Parametry checkRead, checkWritei checkErrornull lub puste. Co najmniej jeden z checkRead, checkWritelub checkError musi zawierać co najmniej jeden Socket.

Wystąpił błąd podczas próby uzyskania dostępu do gniazda.

Platforma .NET 5 lub nowsza: co najmniej jedno gniazdo jest usuwane.

Parametr checkRead, checkWritelub checkError zawiera zbyt wiele gniazd.

Przykłady

Poniższy przykład kodu używa 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 jest metodą statyczną, która określa stan co najmniej jednego wystąpienia Socket. Przed użyciem metody Select należy umieścić co najmniej jedno gniazdo w IList. Sprawdź czytelność, wywołując Select za pomocą IList jako parametru checkRead. Aby sprawdzić gniazda pod kątem możliwości zapisu, użyj parametru checkWrite. Aby wykryć warunki błędów, użyj checkError. Po wywołaniu SelectIList zostaną wypełnione tylko tymi gniazdami, które spełniają warunki.

Jeśli jesteś w stanie nasłuchiwania, czytelność oznacza, że wywołanie Accept powiedzie się 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 zdalna Socket zamknęła połączenie; w takim przypadku wywołanie Receive zostanie zwrócone natychmiast, przy zwróconych zero bajtów.

Select zwraca wartość, gdy co najmniej jedno z gniazd zainteresowania (gniazda w checkRead, checkWritei checkError listach) 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 wykonasz wywołanie nieblokujące w celu Connect, zapis oznacza, że połączenie zostało nawiązane pomyślnie. Jeśli masz już ustanowione połączenie, zapis oznacza, że wszystkie operacje wysyłania powiedzą się bez blokowania.

Jeśli wykonano wywołanie nieblokujące do Connect, parametr checkerror identyfikuje gniazda, które nie zostały pomyślnie połączone.

Nuta

Użyj metody Poll, jeśli chcesz określić tylko stan pojedynczej Socket.

Nuta

Ta metoda nie może wykryć niektórych rodzajów problemów z połączeniem, takich jak uszkodzony sieciowy lub że host zdalny został zamknięty nieprzyzwoicie. Aby wykryć tego rodzaju błędy, należy spróbować wysłać lub odebrać dane.

Nuta

Jeśli zostanie wyświetlony SocketException, użyj właściwości SocketException.ErrorCode, aby uzyskać określony kod błędu. Po uzyskaniu tego kodu zapoznaj się z kodem błędu interfejsu API windows Sockets w wersji 2 dokumentacji, aby uzyskać szczegółowy opis błędu.

Zobacz też

Dotyczy