Bagikan melalui


Socket.Select Metode

Definisi

Overload

Select(IList, IList, IList, TimeSpan)

Menentukan status satu atau beberapa soket.

Select(IList, IList, IList, Int32)

Menentukan status satu atau beberapa soket.

Select(IList, IList, IList, TimeSpan)

Sumber:
Socket.cs
Sumber:
Socket.cs
Sumber:
Socket.cs

Menentukan status satu atau beberapa 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)

Parameter

checkRead
IList

IList instans Socket untuk memeriksa keterbacaan.

checkWrite
IList

IList instans Socket untuk memeriksa writability.

checkError
IList

IList instans Socket untuk memeriksa kesalahan.

timeout
TimeSpan

Nilai batas waktu. Nilai yang sama dengan mikrosekon -1 menunjukkan batas waktu tak terbatas.

Pengecualian

Parameter checkRead, checkWrite, dan checkError semuanya null atau kosong. Setidaknya salah satu checkRead, checkWrite, atau checkError harus berisi setidaknya satu Socket.

Parameter checkRead, checkWrite, atau checkError berisi terlalu banyak soket.

timeout kurang dari mikrodetik -1 atau lebih besar dari mikrodetik MaxValue

Terjadi kesalahan saat mencoba mengakses soket.

Satu atau beberapa soket dibuang.

Berlaku untuk

Select(IList, IList, IList, Int32)

Sumber:
Socket.cs
Sumber:
Socket.cs
Sumber:
Socket.cs

Menentukan status satu atau beberapa 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)

Parameter

checkRead
IList

IList instans Socket untuk memeriksa keterbacaan.

checkWrite
IList

IList instans Socket untuk memeriksa writability.

checkError
IList

IList instans Socket untuk memeriksa kesalahan.

microSeconds
Int32

Nilai waktu habis, dalam mikrosekon. Nilai -1 menunjukkan batas waktu tak terbatas.

Pengecualian

Parameter checkRead, checkWrite, dan checkError semuanya null atau kosong. Setidaknya salah satu checkRead, checkWrite, atau checkError harus berisi setidaknya satu Socket.

Terjadi kesalahan saat mencoba mengakses soket.

.NET 5 dan yang lebih baru: Satu atau beberapa soket dibuang.

Parameter checkRead, checkWrite, atau checkError berisi terlalu banyak soket.

Contoh

Contoh kode berikut menggunakan Select untuk menentukan soket mendengarkan mana yang memiliki permintaan koneksi.

      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

Keterangan

Select adalah metode statis yang menentukan status satu atau beberapa instans Socket. Anda harus menempatkan satu atau beberapa soket ke dalam IList sebelum Anda dapat menggunakan metode Select. Periksa keterbacaan dengan memanggil Select dengan IList sebagai parameter checkRead. Untuk memeriksa soket Anda untuk writability, gunakan parameter checkWrite. Untuk mendeteksi kondisi kesalahan, gunakan checkError. Setelah memanggil Select, IList hanya akan diisi dengan soket yang memenuhi kondisi.

Jika Anda berada dalam status mendengarkan, keterbacaan berarti bahwa panggilan ke Accept akan berhasil tanpa memblokir. Jika Anda telah menerima koneksi, keterbacaan berarti bahwa data tersedia untuk dibaca. Dalam kasus ini, semua operasi penerimaan akan berhasil tanpa memblokir. Keterbacaan juga dapat menunjukkan apakah Socket jarak jauh telah mematikan koneksi; dalam hal ini panggilan ke Receive akan segera kembali, dengan nol byte dikembalikan.

Select mengembalikan ketika setidaknya salah satu soket yang menarik (soket dalam daftar checkRead, checkWrite, dan checkError) memenuhi kriteria yang ditentukan, atau parameter microSeconds terlampaui, mana yang lebih dulu. Mengatur microSeconds ke -1 menentukan batas waktu tak terbatas.

Jika Anda melakukan panggilan nonblocking ke Connect, writability berarti Anda telah berhasil tersambung. Jika Anda sudah memiliki koneksi yang dibuat, writability berarti bahwa semua operasi pengiriman akan berhasil tanpa memblokir.

Jika Anda telah melakukan panggilan non-pemblokiran ke Connect, parameter checkerror mengidentifikasi soket yang belum berhasil tersambung.

Nota

Gunakan metode Poll jika Anda hanya ingin menentukan status satu Socket.

Nota

Metode ini tidak dapat mendeteksi jenis masalah koneksi tertentu, seperti kabel jaringan yang rusak, atau bahwa host jarak jauh dimatikan dengan tidak sah. Anda harus mencoba mengirim atau menerima data untuk mendeteksi kesalahan semacam ini.

Nota

Jika Anda menerima SocketException, gunakan properti SocketException.ErrorCode untuk mendapatkan kode kesalahan tertentu. Setelah Anda mendapatkan kode ini, lihat kode kesalahan API Windows Sockets versi 2 dokumentasi untuk deskripsi terperinci tentang kesalahan tersebut.

Lihat juga

Berlaku untuk