Socket.Select(IList, IList, IList, Int32) Socket.Select(IList, IList, IList, Int32) Socket.Select(IList, IList, IList, Int32) Socket.Select(IList, IList, IList, Int32) Method

Определение

Определяет состояние одного или нескольких сокетов.Determines the status of one or more sockets.

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 IList IList IList

IList экземпляров Socket для проверки удобства чтения.An IList of Socket instances to check for readability.

checkWrite
IList IList IList IList

IList экземпляров Socket для проверки удобства ведения записи.An IList of Socket instances to check for writability.

checkError
IList IList IList IList

IList экземпляров Socket для проверки ошибок.An IList of Socket instances to check for errors.

microSeconds
Int32 Int32 Int32 Int32

Значение времени ожидания в миллисекундах.The time-out value, in microseconds. Значение -1 указывает на бесконечное время ожидания.A -1 value indicates an infinite time-out.

Исключения

Параметр checkRead имеет значение null или является пустым.The checkRead parameter is null or empty.

- и --and- Параметр checkWrite имеет значение null или является пустым.The checkWrite parameter is null or empty - и --and- Параметр checkError имеет значение null или является пустым.The checkError parameter is null or empty.

Произошла ошибка при попытке доступа к сокету.An error occurred when attempting to access the socket.

Примеры

В следующем примере кода используется Select , чтобы определить, какие сокеты прослушивания имеют запрос на соединение.The following code example uses Select to determine which listening sockets have a connection request.

      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— Это статический метод, который определяет состояние одного или нескольких Socket экземпляров.Select is a static method that determines the status of one or more Socket instances. IList ПередSelect использованием метода необходимо поместить один или несколько сокетов в.You must place one or more sockets into an IList before you can use the Select method. Проверьте наличие удобочитаемости, вызвав Select метод IList с checkRead параметром.Check for readability by calling Select with the IList as the checkRead parameter. Чтобы проверить сокеты для записи, используйте checkWrite параметр.To check your sockets for writability, use the checkWrite parameter. Для обнаружения условий ошибок используйте checkError.For detecting error conditions, use checkError. После вызова Selectфункции IList будут заполнены только теми сокетами, которые соответствуют условиям.After calling Select, the IList will be filled with only those sockets that satisfy the conditions.

В состоянии прослушивания удобочитаемость означает, что вызов Accept будет выполнен без блокировки.If you are in a listening state, readability means that a call to Accept will succeed without blocking. Если вы уже приняли подключение, удобочитаемость означает, что данные доступны для чтения.If you have already accepted the connection, readability means that data is available for reading. В таких случаях все операции получения будут выполняться без блокировки.In these cases, all receive operations will succeed without blocking. Удобочитаемость также может указывать на то, Socket что удаленное соединение завершилось. в этом случае Receive вызов будет немедленно возвращаться с нулевым количеством байт.Readability can also indicate whether the remote Socket has shut down the connection; in that case a call to Receive will return immediately, with zero bytes returned.

SelectВозвращает, когда по крайней мере один из нужных сокетов (сокеты в checkReadсписках checkWrite, и checkError ) соответствует заданным условиям, или превышено значение параметра в зависимости от того, что microSeconds происходит первым.Select returns when at least one of the sockets of interest (the sockets in the checkRead, checkWrite, and checkError lists) meets its specified criteria, or the microSeconds parameter is exceeded, whichever comes first. Значение microSeconds параметра равно-1 указывает неограниченное время ожидания.Setting microSeconds to -1 specifies an infinite time-out.

Если вы сделаете неблокирующий вызов Connect, записи означает, что соединение установлено успешно.If you make a nonblocking call to Connect, writability means that you have connected successfully. Если соединение уже установлено, записи означает, что все операции отправки будут выполнены без блокировки.If you already have a connection established, writability means that all send operations will succeed without blocking.

Если вы выполнили неблокирующий вызов Connect checkerror , параметр определяет сокеты, которые не были успешно подключены.If you have made a non-blocking call to Connect, the checkerror parameter identifies sockets that have not connected successfully.

Примечание

Используйте метод Poll , если хотите определить только состояние одного Socketобъекта.Use the Poll method if you only want to determine the status of a single Socket.

Примечание

Этот метод не может обнаружить некоторые виды проблем с подключением, например обрыв сетевого кабеля или некорректное завершение работы удаленного узла.This method cannot detect certain kinds of connection problems, such as a broken network cable, or that the remote host was shut down ungracefully. Необходимо попытаться отправить или получить данные для обнаружения ошибок этих типов.You must attempt to send or receive data to detect these kinds of errors.

Примечание

Если вы получаете SocketException, SocketException.ErrorCode используйте свойство для получения конкретного кода ошибки.If you receive a SocketException, use the SocketException.ErrorCode property to obtain the specific error code. После получения этого кода обратитесь к документации по коду ошибки API Windows Sockets версии 2 для получения подробного описания ошибки.After you have obtained this code, refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Применяется к

Дополнительно