Socket.Select Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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
- 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
, checkWrite
veya checkError
parametresi veya null
boş.
checkRead
, checkWrite
veya checkError
parametresi çok fazla yuva içeriyor.
- timeout
1 mikrosaniyeden küçük veya mikrosaniyeden MaxValue 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
- microSeconds
- Int32
Mikrosaniye olarak zaman aşımı değeri. -1 değeri sonsuz bir zaman aşımına işaret eder.
Özel durumlar
checkRead
parametresi null
veya boş.
-Ve-
checkWrite
Parametre null
veya boş
-Ve-
checkError
parametresi null
veya boş.
Yuvaya erişmeye çalışılırken bir hata oluştu.
.NET 5 ve üzeri: Bir veya daha fazla yuva atılır.
checkRead
, checkWrite
veya 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 kullanır Select .
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. yöntemini kullanabilmeniz için önce bir IList veya daha fazla yuva yerleştirmelisiniz Select . parametresiyle IListcheckRead
çağırarak Select okunabilirliği denetleyin. Yuvalarınızın yazılabilirliğini denetlemek için parametresini checkWrite
kullanın. Hata koşullarını algılamak için kullanın checkError
. çağrıldıktan Selectsonra, IList yalnızca koşulları karşılayan yuvalarla doldurulur.
Dinleme durumundaysanız okunabilirlik, çağrısının Accept engellenmeden başarılı olacağı anlamına gelir. Bağlantıyı zaten kabul ettiyseniz okunabilirlik, verilerin okunabilmesi anlamına gelir. Böyle durumlarda, tüm alma işlemleri engelleme olmadan başarılı olur. Okunabilirlik, uzak Socket sunucunun 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, ilgili yuvalardan en az birinin (, checkWrite
ve checkError
listelerindeki checkRead
yuvalar) belirtilen ölçütleri karşıladığında veya microSeconds
parametre aşıldığında (hangisi önce gelirse) döndürür. -1 ayarı microSeconds
sonsuz bir zaman aşımı belirtir.
için engelleyici olmayan bir çağrı Connectyaparsanı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.
öğesine engelleyici olmayan bir çağrı Connectcheckerror
yaptıysanız, parametresi başarıyla bağlanmamış yuvaları tanımlar.
Not
Bu yöntem, bozuk bir ağ kablosu gibi belirli türdeki bağlantı sorunlarını veya uzak ana bilgisayarı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 alırsanız, belirli bir SocketExceptionhata kodunu almak için özelliğini kullanın SocketException.ErrorCode . 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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin