次の方法で共有


Socket.Select メソッド

定義

オーバーロード

Select(IList, IList, IList, TimeSpan)

1 つ以上のソケットの状態を決定します。

Select(IList, IList, IList, Int32)

1 つ以上のソケットの状態を決定します。

Select(IList, IList, IList, TimeSpan)

ソース:
Socket.cs
ソース:
Socket.cs
ソース:
Socket.cs

1 つ以上のソケットの状態を決定します。

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)

パラメーター

checkRead
IList

読みやすさを確認する Socket インスタンスの IList

checkWrite
IList

書き込み可能性を確認する Socket インスタンスの IList

checkError
IList

エラーをチェックする Socket インスタンスの IList

timeout
TimeSpan

タイムアウト値。 マイクロ秒 -1 等しい値は、無限タイムアウトを示します。

例外

checkReadcheckWrite、および checkError パラメーターはすべて null または空です。 少なくとも 1 つの checkReadcheckWrite、または checkError に少なくとも 1 つの Socketが含まれている必要があります。

checkReadcheckWrite、または checkError パラメーターに含まれるソケットが多すぎます。

timeout が -1 マイクロ秒未満か、MaxValue マイクロ秒より大きかった

ソケットにアクセスしようとしたときにエラーが発生しました。

1 つ以上のソケットが破棄されました。

適用対象

Select(IList, IList, IList, Int32)

ソース:
Socket.cs
ソース:
Socket.cs
ソース:
Socket.cs

1 つ以上のソケットの状態を決定します。

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)

パラメーター

checkRead
IList

読みやすさを確認する Socket インスタンスの IList

checkWrite
IList

書き込み可能性を確認する Socket インスタンスの IList

checkError
IList

エラーをチェックする Socket インスタンスの IList

microSeconds
Int32

タイムアウト値 (マイクロ秒単位)。 -1 値は、無限のタイムアウトを示します。

例外

checkReadcheckWrite、および checkError パラメーターはすべて null または空です。 少なくとも 1 つの checkReadcheckWrite、または checkError に少なくとも 1 つの Socketが含まれている必要があります。

ソケットにアクセスしようとしたときにエラーが発生しました。

.NET 5 以降: 1 つ以上のソケットが破棄されます。

checkReadcheckWrite、または checkError パラメーターに含まれるソケットが多すぎます。

次のコード例では、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

注釈

Select は、1 つ以上の Socket インスタンスの状態を決定する静的メソッドです。 Select メソッドを使用するには、1 つ以上のソケットを IList に配置する必要があります。 checkRead パラメーターとして IList を使用して Select を呼び出して、読みやすさを確認します。 ソケットの書き込み可能性を確認するには、checkWrite パラメーターを使用します。 エラー状態を検出する場合は、checkErrorを使用します。 Selectを呼び出すと、IList には条件を満たすソケットのみが入力されます。

リッスン状態の場合、読みやすさは、Accept の呼び出しがブロックされずに成功することを意味します。 接続を既に受け入れている場合、読みやすさはデータが読み取り可能であることを意味します。 このような場合、すべての受信操作はブロックされずに成功します。 読みやすさは、リモート Socket が接続をシャットダウンしたかどうかを示すこともできます。その場合、Receive の呼び出しはすぐに返され、0 バイトが返されます。

Select は、対象のソケット (checkReadcheckWrite、および checkError リスト内のソケット) の少なくとも 1 つが指定された条件を満たすか、microSeconds パラメーターを超えたときに、いずれか早い方を返します。 microSeconds を -1 に設定すると、無限のタイムアウトが指定されます。

Connectの非ブロッキング呼び出しを行う場合、書き込み可能性は、正常に接続されたことを意味します。 既に接続が確立されている場合、書き込み可能性は、すべての送信操作がブロックされずに成功することを意味します。

Connectに対して非ブロッキング呼び出しを行った場合、checkerror パラメーターは正常に接続されていないソケットを識別します。

手記

1 つの Socketの状態のみを確認する場合は、Poll メソッドを使用します。

手記

この方法では、ネットワーク ケーブルの破損やリモート ホストが正常にシャットダウンされたなど、特定の種類の接続の問題を検出できません。 このようなエラーを検出するには、データの送受信を試みる必要があります。

手記

SocketExceptionを受け取った場合は、SocketException.ErrorCode プロパティを使用して特定のエラー コードを取得します。 このコードを取得した後、エラーの詳細な説明については、Windows ソケット バージョン 2 API のエラー コード ドキュメントを参照してください。

こちらもご覧ください

適用対象