Aracılığıyla paylaş


Socket.Select Yöntem

Tanım

Aşırı Yüklemeler

Select(IList, IList, IList, TimeSpan)

Bir veya daha fazla yuvanın durumunu belirler.

Select(IList, IList, IList, Int32)

Bir veya daha fazla yuvanın durumunu belirler.

Select(IList, IList, IList, TimeSpan)

Kaynak:
Socket.cs
Kaynak:
Socket.cs
Kaynak:
Socket.cs

Bir veya daha fazla yuvanın durumunu belirler.

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)

Parametreler

checkRead
IList

Okunabilirliği denetlemek için Socket örneklerinin IList.

checkWrite
IList

Yazılabilirliği denetlemek için Socket örneklerinin IList.

checkError
IList

Hataları denetlemek için Socket örneklerinin IList.

timeout
TimeSpan

Zaman aşımı değeri. -1 mikrosaniyeye eşit bir değer sonsuz zaman aşımına işaret eder.

Özel durumlar

checkRead, checkWriteve checkError parametrelerinin tümü null veya boş olur. checkRead, checkWriteveya checkError en az biri en az bir Socketiçermelidir.

checkRead, checkWriteveya checkError parametresi çok fazla yuva içeriyor.

timeout -1 mikrosaniyeden az veya MaxValue mikrosaniyeden büyük

Yuvaya erişmeye çalışılırken bir hata oluştu.

Bir veya daha fazla yuva atılmış.

Şunlara uygulanır

Select(IList, IList, IList, Int32)

Kaynak:
Socket.cs
Kaynak:
Socket.cs
Kaynak:
Socket.cs

Bir veya daha fazla yuvanın durumunu belirler.

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)

Parametreler

checkRead
IList

Okunabilirliği denetlemek için Socket örneklerinin IList.

checkWrite
IList

Yazılabilirliği denetlemek için Socket örneklerinin IList.

checkError
IList

Hataları denetlemek için Socket örneklerinin IList.

microSeconds
Int32

Mikrosaniye olarak zaman aşımı değeri. -1 değeri sonsuz bir zaman aşımı olduğunu gösterir.

Özel durumlar

checkRead, checkWriteve checkError parametrelerinin tümü null veya boş olur. checkRead, checkWriteveya checkError en az biri en az bir Socketiçermelidir.

Yuvaya erişmeye çalışılırken bir hata oluştu.

.NET 5 ve üzeri: Bir veya daha fazla yuva atılır.

checkRead, checkWriteveya checkError parametresi çok fazla yuva içeriyor.

Örnekler

Aşağıdaki kod örneği, hangi dinleme yuvalarının bağlantı isteğine sahip olduğunu belirlemek için Select kullanır.

      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

Açıklamalar

Select, bir veya daha fazla Socket örneğin durumunu belirleyen statik bir yöntemdir. Select yöntemini kullanabilmeniz için önce bir IList bir veya daha fazla yuva yerleştirmeniz gerekir. checkRead parametresi olarak IList ile Select çağırarak okunabilirliği denetleyin. Yuvalarınızın yazılabilirliğini denetlemek için checkWrite parametresini kullanın. Hata koşullarını algılamak için checkErrorkullanın. Selectçağrıldıktan sonra IList yalnızca koşulları karşılayan yuvalarla doldurulur.

Dinleme durumundaysanız okunabilirlik, Accept çağrısının engellenmeden başarılı olacağı anlamına gelir. Bağlantıyı zaten kabul ettiyseniz okunabilirlik, verilerin okunabilmesi anlamına gelir. Bu gibi durumlarda, engelleme olmadan tüm alma işlemleri başarılı olur. Okunabilirlik, uzak Socket bağlantıyı kapatıp kapatmadığını da gösterebilir; bu durumda, Receive çağrısı sıfır bayt döndürülerek hemen döndürülür.

Select, ilgi çekici yuvalardan en az biri (checkRead, checkWriteve checkError listelerindeki yuvalar) belirtilen ölçütleri karşıladığında veya microSeconds parametresi aşıldığında (hangisi önce gelirse) döndürür. microSeconds -1 olarak ayarlanması sonsuz bir zaman aşımı belirtir.

Connectiçin engelleyici olmayan bir çağrı yaparsanız yazılabilirlik, başarıyla bağlandığınız anlamına gelir. Önceden kurulmuş bir bağlantınız varsa, yazılabilirlik tüm gönderme işlemlerinin engellenmeden başarılı olacağı anlamına gelir.

Connectiçin engelleyici olmayan bir çağrı yaptıysanız, checkerror parametresi başarıyla bağlanmamış yuvaları tanımlar.

Not

Yalnızca tek bir Socketdurumunu belirlemek istiyorsanız Poll yöntemini kullanın.

Not

Bu yöntem, bozuk bir ağ kablosu gibi belirli türdeki bağlantı sorunlarını veya uzak konağın düzgün bir şekilde kapatıldığını algılayamaz. Bu tür hataları algılamak için veri göndermeye veya almaya çalışmanız gerekir.

Not

bir SocketExceptionalırsanız, belirli bir hata kodunu almak için SocketException.ErrorCode özelliğini kullanın. Bu kodu aldıktan sonra, hatanın ayrıntılı açıklaması için Windows Yuvaları sürüm 2 API hata kodu belgelerine bakın.

Ayrıca bkz.

Şunlara uygulanır