1 つ以上のソケットのステータスを決定します。
Public Shared Sub Select( _
ByVal checkRead As IList, _ ByVal checkWrite As IList, _ ByVal checkError As IList, _ ByVal microSeconds As Integer _)
[C#]
public static void Select(IListcheckRead,IListcheckWrite,IListcheckError,intmicroSeconds);
[C++]
public: static void Select(IList* checkRead,IList* checkWrite,IList* checkError,intmicroSeconds);
[JScript]
public static function Select(
checkRead : IList,checkWrite : IList,checkError : IList,microSeconds : int);
パラメータ
- checkRead
読み取り機能をチェックする Socket インスタンスの IList 。 - checkWrite
書き込み機能をチェックする Socket インスタンスの IList 。 - checkError
エラーをチェックする Socket インスタンスの IList 。 - microSeconds
マイクロ秒単位の待機時間。
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | checkRead パラメータが null 参照 (Visual Basic では Nothing) または空です。
および checkWrite パラメータが null 参照 (Nothing) または空です。 および checkError パラメータが null 参照 (Nothing) または空です。 |
SocketException | ソケットへのアクセスを試みているときにエラーが発生しました。詳細については「解説」を参照してください。 |
解説
Select は、1 つ以上の Socket インスタンスのステータスを決定する静的メソッドです。 Select メソッドを使用するには、1 つ以上のソケットを IList に挿入する必要があります。ソケットが読み取り可能かどうかを確認するには、 checkread パラメータに IList を指定して Select を呼び出します。書き込み可能かどうかを確認するには、 checkwrite パラメータを使用します。エラー条件を検出する場合は、 Checkerror を使用します。 Select を呼び出したら、 IList には、その条件を満たすソケットだけが設定されます。
読み取り可能な状態では、待機状態の場合、 Accept がブロックせずに正常に呼び出されます。接続を受け入れている場合は、読み取ることができるデータが存在することを意味します。いずれの場合も、すべての受信操作がブロックせずに正常に行われます。また、リモート Socket が接続をシャットダウンしているかどうかも示します。接続をシャットダウンしている場合は、 Receive の実行がすぐに終了し、0 バイトが返されます。
Connect を非ブロッキングで呼び出す場合、書き込み可能とは正常に接続が確立されていることを意味します。既に接続が確立されている場合は、すべての送信操作がブロックせずに正常に行われます。
Connect を非ブロッキングで呼び出した場合は、checkerror パラメータが正常に接続されていないソケットを特定します。
メモ 1 つの Socket のステータスを判断するだけの場合は、 Poll メソッドを使用します。
メモ SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。
使用例
[Visual Basic, C#, C++] Select を使用し、待機中のどのソケットが接続を要求しているかを判断する例を次に示します。
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
[C#]
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();
}
[C++]
IPHostEntry *lipa = Dns::Resolve(Dns::GetHostName());
//Gets three separate local endpoints.
IPEndPoint *lep1 = new IPEndPoint(lipa->AddressList[0], 11000);
IPEndPoint *lep2 = new IPEndPoint(lipa->AddressList[0], 11001);
IPEndPoint *lep3 = new IPEndPoint(lipa->AddressList[0], 11002);
//creates an array of endpoints.
IPEndPoint *ipendpoints[] = new IPEndPoint* [3];
ipendpoints[0] = lep1;
ipendpoints[1] = lep2;
ipendpoints[2] = lep3;
//Creates three separate sockets.
Socket *s1 = new Socket(lep1->Address->AddressFamily,
SocketType::Stream, ProtocolType::Tcp);
Socket *s2 = new Socket(lep2->Address->AddressFamily,
SocketType::Stream, ProtocolType::Tcp);
Socket *s3 = new Socket(lep3->Address->AddressFamily,
SocketType::Stream, ProtocolType::Tcp);
Socket *socketList[] = new 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( __try_cast<IList*>( socketList ), NULL, NULL, 1000);
//Reads on the sockets returned by Select.
Byte buffer[] = new Byte[1024];
String *outString;
for (Int32 j=0; j < (socketList->Length-1); j++){
socketList[j]->Receive(buffer);
outString = "Socket ";
outString->Concat((__box(j))->ToString(), " has the message", Encoding::ASCII->GetString(buffer));
Console::WriteLine(outString);
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET, Common Language Infrastructure (CLI) Standard
参照
Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | IList | Accept | Connect | Poll