Поделиться через


Socket.Select Метод

Определение

Перегрузки

Имя Описание
Select(IList, IList, IList, TimeSpan)

Определяет состояние одного или нескольких сокетов.

Select(IList, IList, IList, Int32)

Определяет состояние одного или нескольких сокетов.

Select(IList, IList, IList, TimeSpan)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

Определяет состояние одного или нескольких сокетов.

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 микросекундам, указывает на бесконечное время ожидания.

Исключения

Значение checkRead, checkWriteи checkError параметры являются все null или пустыми. По крайней мере один из checkRead, checkWriteили checkError должен содержать по крайней мере один Socket.

Параметр checkRead, checkWriteили checkError параметр содержит слишком много сокетов.

Меньше timeout , чем -1 микросекунда или больше MaxValue микросекунд

Произошла ошибка при попытке доступа к сокету.

Один или несколько сокетов были удалены.

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

Select(IList, IList, IList, Int32)

Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs
Исходный код:
Socket.cs

Определяет состояние одного или нескольких сокетов.

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 указывает бесконечное время ожидания.

Исключения

Значение checkRead, checkWriteи checkError параметры являются все null или пустыми. По крайней мере один из checkRead, checkWriteили checkError должен содержать по крайней мере один Socket.

Произошла ошибка при попытке доступа к сокету.

.NET 5 и более поздних версий: один или несколько сокетов удаляются.

Параметр checkRead, checkWriteили checkError параметр содержит слишком много сокетов.

Примеры

В следующем примере кода определяется Select , какие сокеты прослушивания имеют запрос на подключение.

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 метода необходимо поместить один или несколько сокетов в один или несколько сокетовIList. Проверьте удобочитаемость путем вызова Select в IList качестве checkRead параметра. Чтобы проверить сокеты для записи, используйте checkWrite этот параметр. Для обнаружения ошибок используйте checkError. После вызова SelectIList он будет заполнен только теми сокетами, которые удовлетворяют условиям.

Если вы находитесь в состоянии прослушивания, удобочитаемость означает, что вызов Accept будет выполнен успешно без блокировки. Если вы уже приняли подключение, возможность чтения означает, что данные доступны для чтения. В таких случаях все операции получения будут успешно выполнены без блокировки. Возможность чтения также может указывать, завершил ли удаленный Socket сеанс подключения. В этом случае вызов, возвращаемый Receive немедленно, с нулевым возвращаемым байтом.

Select возвращает, когда по крайней мере один из сокетов, интересующих вас (сокеты в checkReadсписках checkWrite, и checkError списков) соответствует заданным условиям, или microSeconds параметр превышается, в зависимости от того, что происходит в первую очередь. Параметр microSeconds -1 указывает бесконечное время ожидания.

Если вы выполняете неблокировку вызова Connect, возможность записи означает, что вы успешно подключились. Если у вас уже установлено подключение, возможность записи означает, что все операции отправки будут успешно выполнены без блокировки.

Если вы выполнили неблокирующий вызов Connect, checkerror параметр определяет сокеты, которые не подключены успешно.

Заметка

Используйте метод, Poll если требуется определить только состояние одного Socket.

Заметка

Этот метод не может обнаружить определенные типы проблем подключения, например сломанный сетевой кабель, или что удаленный узел был закрыт неграмотно. Для обнаружения таких ошибок необходимо попытаться отправить или получить данные.

Заметка

При получении SocketExceptionсвойства используйте SocketException.ErrorCode свойство для получения определенного кода ошибки. Получив этот код, ознакомьтесь с документацией по коду ошибки API сокетов Windows версии 2 , чтобы получить подробное описание ошибки.

См. также раздел

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